Sestavte si tuto jednoduchou aplikaci, abyste si procvičili své matematické programování a zároveň se naučili něco málo o kódování GUI.

Sledování výdajů je základním nástrojem, který pomáhá jednotlivcům a firmám spravovat jejich finanční transakce. Pomocí nástroje pro sledování výdajů můžete vytvářet rozpočty, kategorizovat výdaje a analyzovat vzorce výdajů.

Zjistěte, jak v Pythonu vytvořit aplikaci pro sledování výdajů s multiplatformním GUI.

Moduly Tkinter, CSV a Matplotlib

K sestavení tohoto sledování výdajů budete potřebovat moduly Tkinter, CSV a Matplotlib.

Tkinter vám to dovolí vytvářet desktopové aplikace. Nabízí řadu widgetů, jako jsou tlačítka, štítky a textová pole, které usnadňují vývoj aplikací.

Modul CSV je vestavěná knihovna Pythonu, která poskytuje funkce pro čtení a zápis CSV (Comma-Separated Values)..

S Matplotlib můžete vytvářet interaktivní vizualizace, jako jsou grafy, grafy a grafy. Jeho použití s ​​moduly jako OpenCV vám může pomoci zvládnout techniky vylepšení obrazu také.

Chcete-li nainstalovat tyto moduly, spusťte:

pip install tk matplotlib 

Definujte strukturu aplikace Expense Tracker

Zdrojový kód tohoto projektu najdete v něm úložiště GitHub.

Začněte importem potřebných modulů. Definujte třídu, Aplikace ExpenseTracker. Nastavte název a rozměry. Definujte seznam pro ukládání výdajů a další pro kategorie. Inicializovat a StringVar jmenoval category_var a nastavte jeho počáteční hodnotu na první kategorii v seznamu kategorií. Dokončete zavoláním na vytvořit_widgety 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 vytvořit_widgety metoda je zodpovědná za přidávání komponent uživatelského rozhraní do vaší aplikace. Vytvořte rámec pro štítky a položky záznamu o výdajích. Vytvořte šest štítků: po jednom pro nadpis, částku výdajů, popis položky, kategorii, datum a celkové náklady. Nastavte každému rodičovský prvek, text, který by měl zobrazovat, a jeho styl písma.

Vytvořte tři vstupní widgety a a Combobox abyste získali odpovídající vstup. Pro vstupní widgety nastavte rodičovský prvek, styl písma a šířku. Definujte nadřazený prvek, seznam hodnot, styl písma a šířku pro Combobox. Svázat category_var na něj, takže vybraná hodnota se 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ět tlačítek: Přidat výdaje, Upravit výdaj, Smazat výdaj, Ušetřete výdaje, a Zobrazit graf výdajů. Nastavte nadřazený prvek každého prvku, text, který se má zobrazit, a příkaz, který se spustí, když na něj kliknete. Vytvořte rámec pro seznam. Nastavte nadřazený prvek, styl písma a šířku.

Vytvořte svislý posuvník a umístěte jej na pravou stranu rámečku. Použijte jej k procházení obsahu seznamu. Uspořádejte všechny prvky s potřebným polstrováním a zavolejte 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 funkcionalitu sledování výdajů

Definujte metodu, přidat_výdaj. Získejte hodnotu výdaje, položky, kategorie a data. Pokud je hodnota výdaje a datum platné, přidejte výdaj do výdaje seznam. Vložte tento záznam do seznamu a vhodně jej naformátujte. Po vložení odstraňte uživatelský vstup ve vstupních polích pro nový vstup.

V opačném případě zobrazte varování, že hodnoty nákladů a data nemohou být prázdné. Volání 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 metodu, edit_expense. Získejte index vybraného záznamu a získejte náklady. Otevřete dialogové okno s výzvou k zadání výdajů. Pokud uživatel poskytl nový výdaj, změňte odpovídajícím způsobem seznam výdajů. Zavolej Obnovit seznam 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 metodu, smazat_výdaj. Získejte index vybraného záznamu a získejte náklady. Předejte index položky, kterou chcete odstranit. Odstraňte tento záznam ze seznamu a zavolejte 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 metodu, Obnovit seznam. Odstraňte existující záznam a místo toho přidejte 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 metodu, update_total_label. Vypočítejte součet všech výdajů v seznamu a aktualizujte jej na štítku. Definujte jinou metodu, ušetřit_výdaje. Vytvořte a otevřete a CSV soubor s názvem výdaje.csv v režimu zápisu. Přidejte záhlaví sloupců do souboru CSV jako první řádek. Opakujte každý záznam o výdajích a zapište jej jako řádek.

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 metodu, zobrazit graf_výdajů. Definujte slovník, category_totals. Iterujte přes výdaje seznam a převeďte částku výdajů na pohyblivou. Uložte celkovou částku výdajů pro každou kategorii. Pokud kategorie již ve slovníku existuje, zvyšte celkovou částku o aktuální částku výdajů. V opačném případě vytvořte nový záznam s aktuální částkou výdajů.

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 kategorie a výdaje do dvou různých seznamů. Vytvořte nový obrázek pro pozemek se zadanou velikostí. Vytvořte výsečový graf pomocí seznamu výdajů jako dat a seznamu kategorií jako štítku. The autopct parametr určuje formát pro zobrazení procentuálních hodnot na řezech grafu. Složit rovnat se na plt.axis abyste zajistili, že výsečový graf nakreslíte jako kruh. Nastavte název výsečového grafu a zobrazte jej.

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

Vytvořte instanci souboru Aplikace ExpenseTracker třída. The mainloop() Funkce říká Pythonu, aby spustil smyčku událostí Tkinter a naslouchal událostem, dokud nezavřete okno.

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

Otestujte různé funkce Python Expense Tracker

Po spuštění programu se spustí okno aplikace. Toto má vstupní pole pro záznam výdajů, popisu položky, kategorie a data. Zadejte nějaké údaje a klikněte na Přidat výdaje knoflík; uvidíte, že se záznam přidá do seznamu. Program také aktualizuje celkové výdaje.

Vyberte záznam a klikněte na Upravit výdaje knoflík. Zobrazí se dialogové okno, které vám umožní aktualizovat jednotlivý záznam.

Kliknutím na Smazat výdaje tlačítko pro odstranění vybraného záznamu.

Při zasažení Zobrazit graf výdajů tlačítko, program zobrazí koláčový graf. Výsečový graf zobrazuje výdaje pro každou kategorii spolu s jejím názvem a procentem.

Vylepšení nástroje pro sledování výdajů

Můžete přidat funkci vyhledávání, která uživatelům umožní najít konkrétní výdaje na základě jejich popisu, částky, kategorie nebo data. Můžete přidat možnost řazení a filtrování záznamů. Lokalizovat aplikaci, aby podporovala různé jazyky a formáty měn.

Aplikaci můžete také rozšířit o podporu upozornění. Nechte uživatele nastavit upozornění, která zabrání překročení rozpočtových limitů nebo upozorní na neobvyklé výdaje.