Zostavte si túto jednoduchú aplikáciu, aby ste si precvičili svoje matematické programovanie a zároveň sa naučili niečo o kódovaní GUI.

Sledovač výdavkov je základným nástrojom, ktorý pomáha jednotlivcom a firmám spravovať ich finančné transakcie. Pomocou nástroja na sledovanie výdavkov môžete vytvárať rozpočty, kategorizovať výdavky a analyzovať vzorce výdavkov.

Zistite, ako vytvoriť aplikáciu na sledovanie výdavkov s multiplatformovým GUI v Pythone.

Moduly Tkinter, CSV a Matplotlib

Na zostavenie tohto sledovača výdavkov budete potrebovať moduly Tkinter, CSV a Matplotlib.

Tkinter vám to dovolí vytvárať desktopové aplikácie. Ponúka množstvo miniaplikácií, ako sú tlačidlá, štítky a textové polia, ktoré uľahčujú vývoj aplikácií.

Modul CSV je vstavaná knižnica Python, ktorá poskytuje funkcie na čítanie a zápis CSV (Comma-Separated Values)..

Pomocou Matplotlib môžete vytvárať interaktívne vizualizácie, ako sú grafy, grafy a grafy. Použitie s modulmi ako OpenCV vám môže pomôcť ovládať techniky vylepšenia obrazu tiež.

instagram viewer

Ak chcete nainštalovať tieto moduly, spustite:

pip install tk matplotlib 

Definujte štruktúru aplikácie Expense Tracker

Zdrojový kód tohto projektu nájdete v ňom úložisko GitHub.

Začnite importovaním potrebných modulov. Definujte triedu, ExpenseTrackerApp. Nastavte názov a rozmery. Definujte zoznam na ukladanie výdavkov a ďalší pre kategórie. Inicializovať a StringVar pomenovaný category_var a nastavte jeho počiatočnú hodnotu na prvú kategóriu v zozname kategórií. Dokončite zavolaním na create_widgets metóda.

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 metóda je zodpovedná za pridávanie komponentov používateľského rozhrania do vašej aplikácie. Vytvorte rámec pre štítky a položky záznamu o výdavkoch. Vytvorte šesť štítkov: po jednom pre nadpis, sumu výdavkov, popis položky, kategóriu, dátum a celkové výdavky. Nastavte rodičovský prvok každého z nich, text, ktorý sa má zobrazovať, a štýl písma.

Vytvorte tri vstupné widgety a a Combobox získať zodpovedajúci vstup. Pre vstupné widgety nastavte rodičovský prvok, štýl písma a šírku. Definujte rodičovský prvok, zoznam hodnôt, štýl písma a šírku pre Combobox. Zviazať category_var k nemu, takže zvolená hodnota sa automaticky aktualizuje.

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)

Definujte päť tlačidiel: Pridať výdavky, Upraviť výdavok, Odstrániť výdavok, Ušetrite výdavky, a Zobraziť graf výdavkov. Nastavte nadradený prvok každého prvku, text, ktorý sa má zobraziť, a príkaz, ktorý sa spustí, keď naň kliknete. Vytvorte rámec pre zoznam. Nastavte nadradený prvok, štýl písma a šírku.

Vytvorte zvislý posuvník a umiestnite ho na pravú stranu rámu. Použite ho na rolovanie cez obsah zoznamu. Usporiadajte všetky prvky s potrebnými výplňami a zavolajte 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()

Definujte funkčnosť sledovania výdavkov

Definujte metódu, pridať_výdavok. Získajte hodnotu výdaja, položky, kategórie a dátumu. Ak je hodnota výdavku a dátum platné, pridajte výdavok do výdavky zoznam. Vložte tento záznam do zoznamu a vhodne ho naformátujte. Po vložení vymažte používateľský vstup v zadávacích poliach pre nový vstup.

V opačnom prípade zobrazte varovanie, že hodnoty výdaja a dátumu nemôžu byť prázdne. Zavolajte 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()

Definujte metódu, edit_expense. Získajte index vybraného záznamu a získajte výdavok. Otvorte dialógové okno s výzvou na zadanie výdavku. Ak používateľ poskytol nový výdavok, zodpovedajúcim spôsobom zmeňte zoznam výdavkov. Zavolajte na obnoviť zoznam a 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()

Definujte metódu, delete_expense. Získajte index vybraného záznamu a získajte výdavok. Zadajte index položky, ktorú chcete odstrániť. Odstráňte túto položku zo zoznamu a zavolajte na 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()

Definujte metódu, obnoviť zoznam. Odstráňte existujúci záznam a namiesto toho pridajte nový záznam s aktualizovanými hodnotami.

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

Definujte metódu, update_total_label. Vypočítajte súčet všetkých výdavkov v zozname a aktualizujte ho na štítku. Definujte inú metódu, ušetriť_výdavky. Vytvorte a otvorte a CSV súbor s názvom výdavky.csv v režime zápisu. Pridajte hlavičky stĺpcov do súboru CSV ako prvý riadok. Opakujte každý záznam o výdavkoch a zapíšte ho ako riadok.

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

Definujte metódu, show_expenses_chart. Definujte slovník, category_totals. Iterujte cez výdavky zoznam a previesť sumu výdavkov na pohyblivú. Uložte celkovú sumu výdavkov pre každú kategóriu. Ak kategória už v slovníku existuje, zvýšte súčet o aktuálnu sumu nákladov. V opačnom prípade vytvorte nový záznam s aktuálnou sumou výdavkov.

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

Extrahujte kategórie a výdavky do dvoch rôznych zoznamov. Vytvorte nový obrázok pre pozemok so zadanou veľkosťou. Vytvorte koláčový graf pomocou zoznamu výdavkov ako údajov a zoznamu kategórií ako štítku. The autopct parameter určuje formát pre zobrazenie percentuálnych hodnôt na rezoch grafu. Pass rovný do plt.axis aby ste zabezpečili, že koláčový graf nakreslíte ako kruh. Nastavte názov koláčového grafu a zobrazte ho.

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

Vytvorte inštanciu súboru ExpenseTrackerApp trieda. The mainloop() funkcia hovorí Pythonu, aby spustil slučku udalostí Tkinter a počúval udalosti, kým nezatvoríte okno.

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

Otestujte rôzne funkcie Python Expense Tracker

Po spustení programu sa spustí okno aplikácie. Toto má vstupné polia na zaznamenanie výdaja, popisu položky, kategórie a dátumu. Zadajte nejaké údaje a kliknite na Pridať výdavky tlačidlo; uvidíte, že sa záznam pridá do zoznamu. Program aktualizuje aj celkové výdavky.

Vyberte záznam a kliknite na Upraviť výdavky tlačidlo. Zobrazí sa dialógové okno, ktoré vám umožní aktualizovať jednotlivý záznam.

Kliknutím na Odstrániť výdavky tlačidlo na odstránenie vybraného záznamu.

Pri zasiahnutí Zobraziť graf výdavkov tlačidlo, program zobrazí koláčový graf. Koláčový graf zobrazuje výdavky pre každú kategóriu spolu s jej názvom a percentom.

Zlepšenie sledovania výdavkov

Môžete pridať funkciu vyhľadávania, ktorá umožní používateľom nájsť konkrétne výdavky na základe ich popisu, sumy, kategórie alebo dátumu. Môžete pridať možnosť triedenia a filtrovania záznamov. Lokalizujte aplikáciu, aby podporovala rôzne jazyky a formáty mien.

Aplikáciu môžete tiež rozšíriť o podporu upozornení. Umožnite používateľovi nastaviť upozornenia, aby ste zabránili prekročeniu rozpočtových limitov alebo upozornili na nezvyčajné výdavky.