Bygg denne enkle appen for å øve på matematisk programmering og lære litt om GUI-koding underveis.
En utgiftssporing er et viktig verktøy som hjelper enkeltpersoner og bedrifter med å administrere sine økonomiske transaksjoner. Med en utgiftssporing kan du lage budsjetter, kategorisere utgifter og analysere utgiftsmønstre.
Finn ut hvordan du bygger en utgiftssporingsapp, med et grensesnitt på tvers av plattformer, i Python.
Tkinter-, CSV- og Matplotlib-modulene
For å bygge denne utgiftssporeren trenger du modulene Tkinter, CSV og Matplotlib.
Tkinter lar deg lage skrivebordsapplikasjoner. Den tilbyr en rekke widgets som knapper, etiketter og tekstbokser som gjør det enkelt å utvikle apper.
CSV-modulen er et innebygd Python-bibliotek som gir funksjonalitet for lesing og skriving CSV-filer (kommaseparerte verdier)..
Med Matplotlib kan du bygge interaktive visualiseringer som grafer, plott og diagrammer. Å bruke den med moduler som OpenCV kan hjelpe deg mestre bildeforbedringsteknikker også.
For å installere disse modulene, kjør:
pip install tk matplotlib
Definer strukturen til Expense Tracker-appen
Du kan finne dette prosjektets kildekode i sin GitHub-depot.
Begynn med å importere de nødvendige modulene. Definer en klasse, ExpenseTrackerApp. Angi tittel og dimensjoner. Definer en liste for å lagre utgiftene og en annen for kategoriene. Initialiser a StringVar navngitt kategori_var og sett startverdien til den første kategorien i kategorilisten. Avslutt med å ringe create_widgets metode.
import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
import csv
import matplotlib.pyplot as plt
classExpenseTrackerApp(tk.Tk):
def__init__(self):
super().__init__()
self.title("Expense Tracker")
self.geometry("1300x600")
self.expenses = []
self.categories = [
"Food",
"Transportation",
"Utilities",
"Entertainment",
"Other",
]
self.category_var = tk.StringVar(self)
self.category_var.set(self.categories[0])
self.create_widgets()
De create_widgets metoden er ansvarlig for å legge til UI-komponenter i appen din. Lag en ramme for utgiftspostens etiketter og oppføringer. Lag seks etiketter: én hver for overskrift, utgiftsbeløp, varebeskrivelse, kategori, dato og total utgift. Angi hver enkelts overordnede element, teksten den skal vise og skriftstilen.
Lag tre oppføringswidgeter og en Combobox for å få tilsvarende input. For oppføringswidgetene angir du det overordnede elementet, skriftstilen og bredden. Definer det overordnede elementet, listen over verdier, skriftstilen og bredden for Combobox. Binde kategori_var til den, slik at den valgte verdien automatisk oppdateres.
defcreate_widgets(self):
self.label = tk.Label(
self, text="Expense Tracker", font=("Helvetica", 20, "bold")
)
self.label.pack(pady=10)
self.frame_input = tk.Frame(self)
self.frame_input.pack(pady=10)
self.expense_label = tk.Label(
self.frame_input, text="Expense Amount:", font=("Helvetica", 12)
)
self.expense_label.grid(row=0, column=0, padx=5)
self.expense_entry = tk.Entry(
self.frame_input, font=("Helvetica", 12), width=15
)
self.expense_entry.grid(row=0, column=1, padx=5)
self.item_label = tk.Label(
self.frame_input, text="Item Description:", font=("Helvetica", 12)
)
self.item_label.grid(row=0, column=2, padx=5)
self.item_entry = tk.Entry(self.frame_input, font=("Helvetica", 12), width=20)
self.item_entry.grid(row=0, column=3, padx=5)
self.category_label = tk.Label(
self.frame_input, text="Category:", font=("Helvetica", 12)
)
self.category_label.grid(row=0, column=4, padx=5)
self.category_dropdown = ttk.Combobox(
self.frame_input,
textvariable=self.category_var,
values=self.categories,
font=("Helvetica", 12),
width=15,
)
self.category_dropdown.grid(row=0, column=5, padx=5)
self.date_label = tk.Label(
self.frame_input, text="Date (YYYY-MM-DD):", font=("Helvetica", 12)
)
self.date_label.grid(row=0, column=6, padx=5)
self.date_entry = tk.Entry(self.frame_input, font=("Helvetica", 12), width=15)
self.date_entry.grid(row=0, column=7, padx=5)
Definer fem knapper: Legg til kostnad, Rediger utgift, Slett utgift, Spar utgifter, og Vis utgiftsdiagram. Angi det overordnede elementet til hver, teksten den skal vise, og kommandoen den skal kjøre når du klikker på den. Lag en ramme for listeboksen. Angi det overordnede elementet, skriftstilen og bredden.
Lag et vertikalt rullefelt og plasser det på høyre side av rammen. Bruk den til å bla gjennom innholdet i listeboksen. Organiser alle elementene med nødvendig polstring og ring update_total_label().
self.add_button = tk.Button(self, text="Add Expense", command=self.add_expense)
self.add_button.pack(pady=5)
self.frame_list = tk.Frame(self)
self.frame_list.pack(pady=10)
self.scrollbar = tk.Scrollbar(self.frame_list)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.expense_listbox = tk.Listbox(
self.frame_list,
font=("Helvetica", 12),
width=70,
yscrollcommand=self.scrollbar.set,
)
self.expense_listbox.pack(pady=5)
self.scrollbar.config(command=self.expense_listbox.yview)
self.edit_button = tk.Button(
self, text="Edit Expense", command=self.edit_expense
)
self.edit_button.pack(pady=5)
self.delete_button = tk.Button(
self, text="Delete Expense", command=self.delete_expense
)
self.delete_button.pack(pady=5)
self.save_button = tk.Button(
self, text="Save Expenses", command=self.save_expenses
)
self.save_button.pack(pady=5)
self.total_label = tk.Label(
self, text="Total Expenses:", font=("Helvetica", 12)
)
self.total_label.pack(pady=5)
self.show_chart_button = tk.Button(
self, text="Show Expenses Chart", command=self.show_expenses_chart
)
self.show_chart_button.pack(pady=5)
self.update_total_label()
Definer funksjonaliteten til Expense Tracker
Definer en metode, add_expense. Hent verdien av utgiften, varen, kategorien og datoen. Hvis verdien av utgiften og datoen er gyldige, legg utgiften til utgifter liste. Sett inn denne posten i listeboksen og formater den riktig. Når den er satt inn, sletter du brukerinndataene i inntastingsboksene for ny input.
Vis ellers en advarsel om at verdiene for utgift og dato ikke kan være tomme. Anrop update_total_label.
defadd_expense(self):
expense = self.expense_entry.get()
item = self.item_entry.get()
category = self.category_var.get()
date = self.date_entry.get()
if expense and date:
self.expenses.append((expense, item, category, date))
self.expense_listbox.insert(
tk.END, f"{expense} - {item} - {category} ({date})"
)
self.expense_entry.delete(0, tk.END)
self.item_entry.delete(0, tk.END)
self.date_entry.delete(0, tk.END)
else:
messagebox.showwarning("Warning", "Expense and Date cannot be empty.")
self.update_total_label()
Definer en metode, edit_expense. Hent indeksen til den valgte posten og få utgiften. Åpne en dialogboks som ber om å angi utgiften. Hvis brukeren har oppgitt en ny utgift, endre utgiftslisten tilsvarende. Ring Oppdater liste og update_total_label.
defedit_expense(self):
selected_index = self.expense_listbox.curselection()
if selected_index:
selected_index = selected_index[0]
selected_expense = self.expenses[selected_index]
new_expense = simpledialog.askstring(
"Edit Expense", "Enter new expense:", initialvalue=selected_expense[0]
)
if new_expense:
self.expenses[selected_index] = (
new_expense,
selected_expense[1],
selected_expense[2],
selected_expense[3],
)
self.refresh_list()
self.update_total_label()
Definer en metode, delete_expense. Hent indeksen til den valgte posten og få utgiften. Send indeksen til oppføringen du vil slette. Slett den oppføringen fra listeboksen og ring update_total_label.
defdelete_expense(self):
selected_index = self.expense_listbox.curselection()
if selected_index:
selected_index = selected_index[0]
del self.expenses[selected_index]
self.expense_listbox.delete(selected_index)
self.update_total_label()
Definer en metode, Oppdater liste. Slett den eksisterende posten og legg til en ny post med de oppdaterte verdiene i stedet.
defrefresh_list(self):
self.expense_listbox.delete(0, tk.END)
for expense, item, category, date in self.expenses:
self.expense_listbox.insert(
tk.END, f"{expense} - {item} - {category} ({date})"
)
Definer en metode, update_total_label. Beregn summen av alle utgifter i listen og oppdater den på etiketten. Definer en annen metode, spare_utgifter. Opprett og åpne en CSV fil navngitt utgifter.csv i skrivemodus. Legg til kolonneoverskrifter i CSV-filen som den første raden. Iterer over hver utgiftspost, og skriv den som en rad.
defupdate_total_label(self):
total_expenses = sum(float(expense[0]) for expense in self.expenses)
self.total_label.config(text=f"Total Expenses: USD {total_expenses:.2f}")
defsave_expenses(self):
with open("expenses.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile)
column_headers = ["Expense Amount", "Item Description", "Category", "Date"]
writer.writerow(column_headers)
for expense in self.expenses:
writer.writerow(expense))
Definer en metode, show_expenses_chart. Definer en ordbok, kategori_totaler. Iterer gjennom utgifter liste og konverter utgiftsbeløpet til flytende. Lagre det totale utgiftsbeløpet for hver kategori. Hvis kategorien allerede finnes i ordboken, øker du summen med gjeldende utgiftsbeløp. Ellers oppretter du en ny oppføring med gjeldende utgiftsbeløp.
defshow_expenses_chart(self):
category_totals = {}
for expense, _, category, _ in self.expenses:
try:
amount = float(expense)
except ValueError:
continue
category_totals[category] = category_totals.get(category, 0) + amount
Trekk ut kategoriene og utgiftene i to forskjellige lister. Lag en ny figur for tomten med den angitte størrelsen. Generer et kakediagram, bruk utgiftslisten som data og kategorilisten som etikett. De autopkt parameter spesifiserer formatet for visning av prosentverdiene på diagramstykkene. Sende lik til plt.akse for å sikre at du tegner sektordiagrammet som en sirkel. Angi tittelen på sektordiagrammet og vis det.
categories = list(category_totals.keys())
expenses = list(category_totals.values())
plt.figure(figsize=(8, 6))
plt.pie(
expenses, labels=categories, autopct="%1.1f%%", startangle=140, shadow=True
)
plt.axis("equal")
plt.title(f"Expense Categories Distribution (USD)")
plt.show()
Opprett en forekomst av ExpenseTrackerApp klasse. De mainloop() funksjonen forteller Python å kjøre Tkinter-hendelsesløkken og lytte etter hendelser til du lukker vinduet.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Test ulike funksjoner i Python Expense Tracker
Når du kjører programmet, vil det åpne et programvindu. Denne har inndatafelt for å registrere utgiften, varebeskrivelsen, kategorien og datoen. Skriv inn noen data og klikk på Legg til kostnad knapp; du vil se at posten blir lagt til i listeboksen. Programmet oppdaterer også de totale utgiftene.
Velg en post og klikk på Rediger utgifter knapp. En dialogboks vises som lar deg oppdatere den individuelle posten.
Ved å klikke på Slett utgifter for å fjerne den valgte posten.
Ved å treffe Vis utgiftsdiagram knappen, viser programmet et sektordiagram. Sektordiagrammet viser utgiftene for hver kategori sammen med navn og prosentandel.
Forbedre utgiftsmåleren
Du kan legge til søkefunksjonalitet for å la brukere finne spesifikke utgifter basert på beskrivelse, beløp, kategori eller dato. Du kan legge til et alternativ for å sortere og filtrere poster. Lokaliser appen for å støtte forskjellige språk og valutaformater.
Du kan også utvide appen med støtte for varsler. La brukeren sette opp varsler for å hindre dem i å overskride budsjettgrensene eller fremheve uvanlige utgifter.