π₯ Full-Screen Responsive Expense Tracker using Tkinter & SQLite | Python GUI Project
Demo :
Click Video πππ
π‘ Features:
✅ Full-Screen Responsive Design
✅ Dark Mode Interface
✅ Add, Delete & Manage Expenses
✅ Export Data as CSV
✅ Tkinter Calendar for Date Selection
π Full Project Source Code Available Below!
π Watch the Demo on YouTube π
πΊ Demo
π Get the Full Code Below! π
/Expense_Tracker/
│── main.py # Main Tkinter App
│── expenses.db # SQLite Database
│── requirements.txt # Dependencies
│── expenses.csv # Exported Data
Code :
import tkinter as tk
from tkinter import ttk, messagebox
from tkcalendar import DateEntry
import sqlite3
import csv
# Database Setup
def setup_db():
conn = sqlite3.connect("expenses.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS expenses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
category TEXT,
amount REAL,
date TEXT
)
""")
conn.commit()
conn.close()
setup_db()
# Add Expense
def add_expense():
category = category_var.get()
amount = amount_entry.get()
date = date_entry.get()
if not category or not amount or not date:
messagebox.showerror("Error", "All fields are required!")
return
try:
amount = float(amount)
except ValueError:
messagebox.showerror("Error", "Amount must be a number!")
return
conn = sqlite3.connect("expenses.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO expenses (category, amount, date) VALUES (?, ?, ?)", (category, amount, date))
conn.commit()
conn.close()
messagebox.showinfo("Success", "Expense added successfully!")
amount_entry.delete(0, tk.END)
update_expense_list()
# Load Expenses
def update_expense_list():
for row in expense_table.get_children():
expense_table.delete(row)
conn = sqlite3.connect("expenses.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM expenses")
records = cursor.fetchall()
conn.close()
for record in records:
expense_table.insert("", tk.END, values=record)
# Delete Expense
def delete_expense():
selected_item = expense_table.selection()
if not selected_item:
messagebox.showerror("Error", "Select an expense to delete!")
return
item = expense_table.item(selected_item, 'values')
expense_id = item[0]
conn = sqlite3.connect("expenses.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM expenses WHERE id = ?", (expense_id,))
conn.commit()
conn.close()
messagebox.showinfo("Success", "Expense deleted successfully!")
update_expense_list()
# Export Expenses to CSV
def export_csv():
conn = sqlite3.connect("expenses.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM expenses")
records = cursor.fetchall()
conn.close()
with open("expenses.csv", "w", newline="") as file:
writer = csv.writer(file)
writer.writerow(["ID", "Category", "Amount", "Date"])
writer.writerows(records)
messagebox.showinfo("Success", "Expenses exported to expenses.csv!")
# GUI Setup
root = tk.Tk()
root.title("π° Daily Expense Tracker")
root.attributes("-fullscreen", True) # Enable Full Screen Mode
root.configure(bg="#1E1E1E")
# Exit Fullscreen on "ESC"
def exit_fullscreen(event=None):
root.attributes("-fullscreen", False)
root.bind("<Escape>", exit_fullscreen)
# Layout Adjustments
frame = tk.Frame(root, bg="#2C3E50", padx=20, pady=20)
frame.pack(expand=True, fill="both", padx=50, pady=50)
# Labels and Input Fields
tk.Label(frame, text="Category:", bg="#2C3E50", fg="white", font=("Arial", 14)).grid(row=0, column=0, pady=5, sticky="w")
category_var = tk.StringVar()
category_entry = ttk.Combobox(frame, textvariable=category_var, values=["Food", "Transport", "Shopping", "Bills", "Other"], width=20)
category_entry.grid(row=0, column=1, pady=5, padx=10)
tk.Label(frame, text="Amount:", bg="#2C3E50", fg="white", font=("Arial", 14)).grid(row=1, column=0, pady=5, sticky="w")
amount_entry = ttk.Entry(frame, width=22)
amount_entry.grid(row=1, column=1, pady=5, padx=10)
tk.Label(frame, text="Date:", bg="#2C3E50", fg="white", font=("Arial", 14)).grid(row=2, column=0, pady=5, sticky="w")
date_entry = DateEntry(frame, width=19, background="darkblue", foreground="white", borderwidth=2)
date_entry.grid(row=2, column=1, pady=5, padx=10)
# Buttons with Hover Effects
def on_hover(e):
e.widget.config(background="#FF3B30")
def on_leave(e):
e.widget.config(background="#FF6F61")
button_style = {"bg": "#FF6F61", "fg": "white", "font": ("Arial", 14, "bold"), "relief": "flat", "width": 20}
add_button = tk.Button(frame, text="➕ Add Expense", command=add_expense, **button_style)
add_button.grid(row=3, column=0, columnspan=2, pady=10)
add_button.bind("<Enter>", on_hover)
add_button.bind("<Leave>", on_leave)
delete_button = tk.Button(frame, text="❌ Delete Selected", command=delete_expense, **button_style)
delete_button.grid(row=4, column=0, columnspan=2, pady=5)
delete_button.bind("<Enter>", on_hover)
delete_button.bind("<Leave>", on_leave)
export_button = tk.Button(frame, text="π€ Export to CSV", command=export_csv, **button_style)
export_button.grid(row=5, column=0, columnspan=2, pady=5)
export_button.bind("<Enter>", on_hover)
export_button.bind("<Leave>", on_leave)
# Expense Table
columns = ("ID", "Category", "Amount", "Date")
expense_table = ttk.Treeview(frame, columns=columns, show="headings", height=10)
for col in columns:
expense_table.heading(col, text=col)
expense_table.column(col, width=150, anchor="center")
expense_table.grid(row=6, column=0, columnspan=2, pady=10, padx=10, sticky="nsew")
update_expense_list()
# Responsive Grid
frame.grid_columnconfigure(0, weight=1)
frame.grid_columnconfigure(1, weight=1)
frame.grid_rowconfigure(6, weight=1)
root.mainloop()
Comments
Post a Comment