πŸ”₯ 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

Popular posts from this blog

πŸš€ Simple Login & Registration System in Python Tkinter πŸ“±

πŸš€ Create a Python Screen Recorder with Audio (Complete Code)

πŸ”₯ Advanced MP3 Music Player in Python | CustomTkinter + Pygame | Free Source Code