Zgradite to preprosto aplikacijo, da boste vadili matematično programiranje in se ob tem naučili nekaj o kodiranju GUI.

Sledilnik stroškov je bistveno orodje, ki posameznikom in podjetjem pomaga pri upravljanju njihovih finančnih transakcij. S sledilnikom stroškov lahko ustvarjate proračune, kategorizirate stroške in analizirate vzorce porabe.

Ugotovite, kako v Pythonu zgraditi aplikacijo za sledenje stroškov z grafičnim vmesnikom za več platform.

Moduli Tkinter, CSV in Matplotlib

Če želite zgraditi ta sledilnik stroškov, boste potrebovali module Tkinter, CSV in Matplotlib.

Tkinter vam omogoča ustvarjanje namiznih aplikacij. Ponuja različne pripomočke, kot so gumbi, oznake in besedilna polja, ki olajšajo razvoj aplikacij.

Modul CSV je vgrajena knjižnica Python, ki zagotavlja funkcionalnost za branje in pisanje Datoteke CSV (vrednosti, ločene z vejico)..

Z Matplotlibom lahko gradite interaktivne vizualizacije, kot so grafi, risbe in diagrami. Pomaga vam lahko uporaba z moduli, kot je OpenCV obvladati tehnike izboljšave slike preveč.

instagram viewer

Če želite namestiti te module, zaženite:

pip install tk matplotlib 

Določite strukturo aplikacije Expense Tracker

Izvorno kodo tega projekta najdete v Repozitorij GitHub.

Začnite z uvozom potrebnih modulov. Določite razred, ExpenseTrackerApp. Določite naslov in dimenzije. Določite seznam za shranjevanje stroškov in drugega za kategorije. Inicializiraj a StringVar imenovan kategorija_var in nastavite njeno začetno vrednost na prvo kategorijo na seznamu kategorij. Zaključite s klicem na create_widgets metoda.

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()

The create_widgets metoda je odgovorna za dodajanje komponent uporabniškega vmesnika vaši aplikaciji. Ustvarite okvir za oznake in vnose v evidenci stroškov. Ustvarite šest oznak: po eno za naslov, znesek stroškov, opis predmeta, kategorijo, datum in skupne stroške. Vsakemu nastavite nadrejeni element, besedilo, ki naj se prikaže, in njegov slog pisave.

Ustvarite tri pripomočke za vnos in a Kombinirano polje da dobite ustrezen vnos. Za vnosne gradnike nastavite nadrejeni element, slog pisave in širino. Določite nadrejeni element, seznam vrednosti, slog pisave in širino za Kombinirano polje. Vezati kategorija_var vanj, tako da se izbrana vrednost samodejno posodobi.

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)

Določite pet gumbov: Dodajte stroške, Uredi stroške, Izbriši stroške, Prihranite stroške, in Prikaži grafikon stroškov. Nastavite nadrejeni element vsakega, besedilo, ki naj se prikaže, in ukaz, ki ga bo zagnal, ko ga kliknete. Ustvarite okvir za polje s seznamom. Nastavite nadrejeni element, slog pisave in širino.

Ustvarite navpični drsni trak in ga postavite na desno stran okvirja. Uporabite ga za pomikanje po vsebini seznamskega polja. Organizirajte vse elemente s potrebnim oblazinjenjem in pokličite 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()

Določite funkcionalnost sledilnika stroškov

Določite metodo, add_expense. Pridobite vrednost stroška, ​​postavke, kategorije in datuma. Če sta vrednost stroška in datum veljavna, dodajte strošek v stroški seznam. Ta zapis vstavite v polje s seznamom in ga ustrezno formatirajte. Ko je vstavljen, izbrišite uporabniški vnos v vnosnih poljih za nov vnos.

V nasprotnem primeru prikažite opozorilo, da vrednosti stroška in datuma ne moreta biti prazni. Pokliči 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()

Določite metodo, edit_expense. Pridobite indeks izbranega zapisa in pridobite stroške. Odprite pogovorno okno z zahtevo po vnosu stroškov. Če je uporabnik navedel nov strošek, ustrezno spremenite seznam stroškov. Pokličite osveži_seznam in 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()

Določite metodo, delete_expense. Pridobite indeks izbranega zapisa in pridobite stroške. Posredujte indeks vnosa, ki ga želite izbrisati. Izbrišite ta vnos s seznama in pokličite 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()

Določite metodo, osveži_seznam. Izbrišite obstoječi zapis in namesto tega dodajte nov zapis s posodobljenimi vrednostmi.

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})"
)

Določite metodo, update_total_label. Izračunajte vsoto vseh stroškov na seznamu in jo posodobite na etiketi. Določite drugo metodo, prihrani_stroške. Ustvarite in odprite a CSV datoteka z imenom stroški.csv v načinu pisanja. Dodajte glave stolpcev v datoteko CSV kot prvo vrstico. Preglejte vsak zapis stroškov in ga zapišite kot vrstico.

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))

Določite metodo, pokaži grafikon_stroškov. Določite slovar, kategorija_vsota. Ponovi skozi stroški seznam in pretvorite znesek stroškov v plavajoči. Shranite skupni znesek stroškov za vsako kategorijo. Če kategorija že obstaja v slovarju, povečajte skupni znesek za znesek trenutnih stroškov. V nasprotnem primeru ustvarite nov vnos s trenutnim zneskom stroškov.

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

Izvlecite kategorije in stroške na dva različna seznama. Ustvarite novo figuro za risbo s podano velikostjo. Ustvarite tortni grafikon z uporabo seznama stroškov kot podatkov in seznama kategorij kot oznake. The autopct parameter določa obliko za prikaz vrednosti odstotkov na rezinah grafikona. Pass enaka do plt.os da zagotovite, da tortni grafikon narišete kot krog. Nastavite naslov tortnega grafikona in ga prikažite.

 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()

Ustvarite primerek ExpenseTrackerApp razred. The glavna zanka() funkcija pove Pythonu, naj zažene zanko dogodkov Tkinter in posluša dogodke, dokler ne zaprete okna.

if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()

Preizkusite različne funkcije sledilnika stroškov Python

Ko zaženete program, se odpre okno aplikacije. Ima vnosna polja za beleženje stroškov, opis predmeta, kategorijo in datum. Vnesite nekaj podatkov in kliknite Dodajte stroške gumb; videli boste, da je zapis dodan v polje s seznamom. Program posodablja tudi skupne stroške.

Izberite zapis in kliknite Uredi stroške gumb. Prikaže se pogovorno okno, ki vam omogoča posodobitev posameznega zapisa.

S klikom na Izbriši stroške gumb za odstranitev izbranega zapisa.

Ob udarcu v Prikaži grafikon stroškov program prikaže tortni grafikon. Tortni grafikon prikazuje stroške za vsako kategorijo skupaj z njenim imenom in odstotkom.

Izboljšanje sledilnika stroškov

Dodate lahko funkcijo iskanja, da uporabnikom omogočite iskanje določenih stroškov glede na njihov opis, znesek, kategorijo ali datum. Dodate lahko možnost razvrščanja in filtriranja zapisov. Lokalizirajte aplikacijo, da bo podpirala različne jezike in oblike valut.

Aplikacijo lahko razširite tudi s podporo za obvestila. Dovolite uporabniku, da nastavi opozorila, da prepreči prekoračitev proračunskih omejitev ali poudari morebitno nenavadno porabo.