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
Post a Comment