import pandas as pd
import matplotlib.pyplot as plt
from tkinter import *
from tkinter import ttk, messagebox
import os
from datetime import datetime
# Create main window
root = Tk()
root.title("Budget Planner with Visualization")
root.geometry("800x600")
# CSV file name
filename = "budget_data.csv"
# Load existing data
if os.path.exists(filename):
df = pd.read_csv(filename)
else:
df = pd.DataFrame(columns=["Date", "Category", "Type", "Amount"])
# Function to add entry
def add_entry():
date = date_entry.get()
category = category_entry.get()
ttype = type_combo.get()
amount = amount_entry.get()
if not date or not category or not ttype or not amount:
messagebox.showerror("Input Error", "All fields are required.")
return
try:
datetime.strptime(date, "%Y-%m-%d")
amount = float(amount)
except:
messagebox.showerror("Input Error", "Invalid date or amount.")
return
new_entry = {"Date": date, "Category": category, "Type": ttype, "Amount": amount}
global df
df = pd.concat([df, pd.DataFrame([new_entry])], ignore_index=True)
df.to_csv(filename, index=False)
update_table()
messagebox.showinfo("Success", "Entry added successfully!")
# Function to update table
def update_table():
for row in tree.get_children():
tree.delete(row)
for index, row in df.iterrows():
tree.insert("", "end", values=list(row))
# Function to show chart
def show_chart():
try:
expense_df = df[df["Type"] == "Expense"]
summary = expense_df.groupby("Category")["Amount"].sum()
summary.plot.pie(autopct="%1.1f%%", startangle=90)
plt.title("Expenses by Category")
plt.ylabel("")
plt.show()
except Exception as e:
messagebox.showerror("Chart Error", str(e))
# Input Form
form_frame = Frame(root)
form_frame.pack(pady=10)
Label(form_frame, text="Date (YYYY-MM-DD)").grid(row=0, column=0, padx=5)
date_entry = Entry(form_frame)
date_entry.grid(row=0, column=1, padx=5)
Label(form_frame, text="Category").grid(row=0, column=2, padx=5)
category_entry = Entry(form_frame)
category_entry.grid(row=0, column=3, padx=5)
Label(form_frame, text="Type").grid(row=1, column=0, padx=5)
type_combo = ttk.Combobox(form_frame, values=["Income", "Expense"], state="readonly")
type_combo.grid(row=1, column=1, padx=5)
Label(form_frame, text="Amount").grid(row=1, column=2, padx=5)
amount_entry = Entry(form_frame)
amount_entry.grid(row=1, column=3, padx=5)
Button(form_frame, text="Add Entry", command=add_entry).grid(row=2, column=0, columnspan=4, pady=10)
# Treeview
tree = ttk.Treeview(root, columns=["Date", "Category", "Type", "Amount"], show="headings")
for col in ["Date", "Category", "Type", "Amount"]:
tree.heading(col, text=col)
tree.column(col, width=150)
tree.pack(fill=BOTH, expand=True, pady=10)
# Show chart button
Button(root, text="Show Expense Chart", command=show_chart).pack(pady=10)
# Load initial table
update_table()
root.mainloop()
No comments:
Post a Comment