-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhuh2.py
More file actions
157 lines (125 loc) · 5.66 KB
/
huh2.py
File metadata and controls
157 lines (125 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import tkinter as tk
from tkinter import ttk, messagebox
import pandas as pd
from datetime import datetime
# File to store expenses
FILE_NAME = "weekly_expense_tracker.xlsx"
# Initialize or load existing data
def initialize_data():
try:
data = pd.read_excel(FILE_NAME)
except FileNotFoundError:
data = pd.DataFrame(columns=["Date", "Category", "Amount", "Income"])
data.to_excel(FILE_NAME, index=False)
return data
# Save data to Excel
def save_data(data):
data.to_excel(FILE_NAME, index=False)
# Add income or expense
def add_entry(category, amount, is_income=False):
global expense_data
try:
amount = float(amount)
entry = pd.DataFrame([{
"Date": datetime.now().strftime("%Y-%m-%d"),
"Category": "Income" if is_income else category,
"Amount": amount if is_income else -amount,
"Income": amount if is_income else 0,
}])
expense_data = pd.concat([expense_data, entry], ignore_index=True)
save_data(expense_data)
update_summary()
# Clear input fields
if not is_income:
category_entry.delete(0, tk.END)
amount_entry.delete(0, tk.END)
messagebox.showinfo("Success", "Entry added successfully!")
except ValueError:
messagebox.showerror("Error", "Please enter a valid amount.")
# Update summary in GUI
def update_summary():
global expense_data
total_income = expense_data["Income"].sum()
total_expenses = expense_data["Amount"].sum()
savings = total_income + total_expenses
summary_var.set(f"Total Income: ${total_income:.2f}\nTotal Expenses: ${-total_expenses:.2f}\nSavings: ${savings:.2f}")
breakdown = expense_data[expense_data["Category"] != "Income"]
breakdown_summary = breakdown.groupby("Category")["Amount"].sum()
breakdown_text = "".join(
[f"{cat}: ${-amt:.2f}\n" for cat, amt in breakdown_summary.items()]
)
breakdown_var.set(breakdown_text)
# Generate improvement suggestions
def improvement_suggestions():
global expense_data
breakdown = expense_data[expense_data["Category"] != "Income"]
category_totals = breakdown.groupby("Category")["Amount"].sum()
suggestions = "Consider reducing spending on:\n"
for category, total in category_totals.items():
if abs(total) > 0.3 * expense_data["Income"].sum(): # Example: if expense > 30% of income
suggestions += f"- {category}: ${-total:.2f}\n"
messagebox.showinfo("Suggestions", suggestions)
# GUI setup
app = tk.Tk()
app.title("Weekly Expense Tracker")
app.geometry("700x800")
app.configure(bg="#f2f9ff")
# Global variables
expense_data = initialize_data()
summary_var = tk.StringVar()
breakdown_var = tk.StringVar()
# Styles
style = ttk.Style()
style.theme_use("clam")
style.configure("TFrame", background="#f2f9ff")
style.configure("TLabel", background="#f2f9ff", font=("Arial", 12))
style.configure("TButton", font=("Arial", 12, "bold"), padding=5)
style.configure("Header.TLabel", font=("Arial", 16, "bold"), background="#004d99", foreground="#ffffff")
# Layout
frame = ttk.Frame(app, padding="10")
frame.pack(fill=tk.BOTH, expand=True)
# Income Section
income_label = ttk.Label(frame, text="Add Income", style="Header.TLabel")
income_label.grid(row=0, column=0, columnspan=2, pady=10, sticky="ew")
income_entry = ttk.Entry(frame, width=30, font=("Arial", 12))
income_entry.grid(row=1, column=0, padx=10, pady=5)
income_button = ttk.Button(
frame, text="Add Income", command=lambda: add_entry("Income", income_entry.get(), is_income=True)
)
income_button.grid(row=1, column=1, padx=10, pady=5)
# Expense Section
expense_label = ttk.Label(frame, text="Add Expense", style="Header.TLabel")
expense_label.grid(row=2, column=0, columnspan=2, pady=20, sticky="ew")
category_label = ttk.Label(frame, text="Category:")
category_label.grid(row=3, column=0, padx=10, sticky=tk.W)
category_entry = tk.Entry(frame, width=30, font=("Arial", 12), bg="#e6f2ff", highlightbackground="#b3d9ff", highlightthickness=1)
category_entry.grid(row=3, column=1, padx=10, pady=5)
amount_label = ttk.Label(frame, text="Amount:")
amount_label.grid(row=4, column=0, padx=10, sticky=tk.W)
amount_entry = tk.Entry(frame, width=30, font=("Arial", 12), bg="#e6f2ff", highlightbackground="#b3d9ff", highlightthickness=1)
amount_entry.grid(row=4, column=1, padx=10, pady=5)
expense_button = ttk.Button(
frame,
text="Add Expense",
command=lambda: add_entry(category_entry.get(), amount_entry.get()),
)
expense_button.grid(row=5, column=0, columnspan=2, pady=10)
# Summary Section
summary_label = ttk.Label(frame, text="Summary", style="Header.TLabel")
summary_label.grid(row=6, column=0, columnspan=2, pady=20, sticky="ew")
summary_text = ttk.Label(frame, textvariable=summary_var, justify=tk.LEFT, font=("Arial", 12), background="#d9ecff", relief="solid")
summary_text.grid(row=7, column=0, columnspan=2, pady=10, sticky=tk.W)
breakdown_label = ttk.Label(frame, text="Expense Breakdown", style="Header.TLabel")
breakdown_label.grid(row=8, column=0, columnspan=2, pady=20, sticky="ew")
breakdown_text = ttk.Label(frame, textvariable=breakdown_var, justify=tk.LEFT, font=("Arial", 12), background="#d9ecff", relief="solid")
breakdown_text.grid(row=9, column=0, columnspan=2, pady=10, sticky=tk.W)
# Suggestions Section
suggestion_button = ttk.Button(
frame, text="Get Improvement Suggestions", command=improvement_suggestions
)
suggestion_button.grid(row=10, column=0, columnspan=2, pady=20)
# Initialize summary
def init():
update_summary()
init()
app.mainloop()