How I Coded an Invoice PDF Generator GUI in 60 Seconds (Python Tkinter + FPDF)

 Demo :


Click Video 👇👇👇






















Code :


from tkinter import *

from tkinter import ttk, messagebox

from fpdf import FPDF

import datetime


class InvoiceApp:

    def __init__(self, root):

        self.root = root

        self.root.title("Invoice Generator")

        self.root.geometry("800x600")

        self.root.configure(bg="#f0f4f7")

        self.items = []


        self.setup_ui()


    def setup_ui(self):

        title = Label(self.root, text="INVOICE GENERATOR", font=("Helvetica", 18, "bold"), bg="#2b6777", fg="white", pady=10)

        title.pack(fill=X)


        frame = Frame(self.root, bg="white", padx=20, pady=10)

        frame.pack(pady=10, padx=20, fill=X)


        Label(frame, text="Item", font=("Helvetica", 12), bg="white").grid(row=0, column=0)

        Label(frame, text="Qty", font=("Helvetica", 12), bg="white").grid(row=0, column=1)

        Label(frame, text="Price", font=("Helvetica", 12), bg="white").grid(row=0, column=2)


        self.item_entry = Entry(frame, font=("Helvetica", 12), width=20)

        self.item_entry.grid(row=1, column=0, padx=5, pady=5)

        self.qty_entry = Entry(frame, font=("Helvetica", 12), width=10)

        self.qty_entry.grid(row=1, column=1, padx=5)

        self.price_entry = Entry(frame, font=("Helvetica", 12), width=10)

        self.price_entry.grid(row=1, column=2, padx=5)


        add_btn = Button(frame, text="Add Item", font=("Helvetica", 12), bg="#52ab98", fg="white", command=self.add_item)

        add_btn.grid(row=1, column=3, padx=10)


        self.tree = ttk.Treeview(self.root, columns=("Item", "Qty", "Price", "Total"), show="headings")

        self.tree.heading("Item", text="Item")

        self.tree.heading("Qty", text="Qty")

        self.tree.heading("Price", text="Price")

        self.tree.heading("Total", text="Total")

        self.tree.pack(padx=20, pady=10, fill=BOTH, expand=True)


        export_btn = Button(self.root, text="Export PDF", font=("Helvetica", 14), bg="#2b6777", fg="white", command=self.export_pdf)

        export_btn.pack(pady=20)


    def add_item(self):

        item = self.item_entry.get()

        qty = self.qty_entry.get()

        price = self.price_entry.get()

        if item and qty.isdigit() and price.replace(".", "", 1).isdigit():

            qty = int(qty)

            price = float(price)

            total = qty * price

            self.items.append((item, qty, price, total))

            self.tree.insert("", END, values=(item, qty, f"{price:.2f}", f"{total:.2f}"))

            self.item_entry.delete(0, END)

            self.qty_entry.delete(0, END)

            self.price_entry.delete(0, END)

        else:

            messagebox.showerror("Invalid Input", "Please enter valid item, quantity and price.")


    def export_pdf(self):

        if not self.items:

            messagebox.showwarning("Empty", "No items to export.")

            return


        pdf = FPDF()

        pdf.add_page()

        pdf.set_font("Arial", "B", 16)

        pdf.cell(190, 10, "Invoice", ln=True, align="C")

        pdf.set_font("Arial", size=12)

        pdf.cell(190, 10, f"Date: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M')}", ln=True, align="R")


        pdf.ln(10)

        pdf.set_fill_color(200, 220, 255)

        pdf.cell(60, 10, "Item", 1, 0, "C", 1)

        pdf.cell(30, 10, "Qty", 1, 0, "C", 1)

        pdf.cell(40, 10, "Price", 1, 0, "C", 1)

        pdf.cell(40, 10, "Total", 1, 1, "C", 1)


        total_sum = 0

        for item in self.items:

            pdf.cell(60, 10, item[0], 1)

            pdf.cell(30, 10, str(item[1]), 1)

            pdf.cell(40, 10, f"{item[2]:.2f}", 1)

            pdf.cell(40, 10, f"{item[3]:.2f}", 1, 1)

            total_sum += item[3]


        pdf.set_font("Arial", "B", 12)

        pdf.cell(130, 10, "Total Amount", 1)

        pdf.cell(40, 10, f"{total_sum:.2f}", 1, 1)


        filename = f"Invoice_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf"

        pdf.output(filename)

        messagebox.showinfo("Success", f"Invoice saved as {filename}")


# Run the app

root = Tk()

app = InvoiceApp(root)

root.mainloop()

Comments

Popular posts from this blog

🚀 Simple Login & Registration System in Python Tkinter 📱

🚀 Create a Python Screen Recorder with Audio (Complete Code)

📡 Fuzzu Packet Sniffer – Python GUI for Real-Time IP Monitoring | Tkinter + Scapy