Erstellen Sie diese einfache App, um Ihre mathematische Programmierung zu üben und nebenbei ein wenig über die GUI-Codierung zu lernen.
Ein Spesen-Tracker ist ein unverzichtbares Tool, das Privatpersonen und Unternehmen bei der Verwaltung ihrer Finanztransaktionen unterstützt. Mit einem Ausgaben-Tracker können Sie Budgets erstellen, Ausgaben kategorisieren und Ausgabenmuster analysieren.
Erfahren Sie, wie Sie in Python eine Spesenverfolgungs-App mit einer plattformübergreifenden Benutzeroberfläche erstellen.
Die Tkinter-, CSV- und Matplotlib-Module
Um diesen Spesen-Tracker zu erstellen, benötigen Sie die Module Tkinter, CSV und Matplotlib.
Tkinter lässt Sie Desktop-Anwendungen erstellen. Es bietet eine Vielzahl von Widgets wie Schaltflächen, Beschriftungen und Textfelder, die die Entwicklung von Apps erleichtern.
Das CSV-Modul ist eine integrierte Python-Bibliothek, die Funktionen zum Lesen und Schreiben bereitstellt CSV-Dateien (Comma-Separated Values)..
Mit Matplotlib können Sie interaktive Visualisierungen wie Grafiken, Plots und Diagramme erstellen. Die Verwendung mit Modulen wie OpenCV kann Ihnen helfen
Beherrschen Sie Bildverbesserungstechniken zu.Um diese Module zu installieren, führen Sie Folgendes aus:
pip install tk matplotlib
Definieren Sie die Struktur der Expense Tracker-App
Den Quellcode dieses Projekts finden Sie in seiner GitHub-Repository.
Beginnen Sie mit dem Importieren der erforderlichen Module. Definieren Sie eine Klasse, ExpenseTrackerApp. Legen Sie den Titel und die Abmessungen fest. Definieren Sie eine Liste zum Speichern der Ausgaben und eine weitere für die Kategorien. Initialisieren Sie a StringVar genannt Kategorie_var und legen Sie den Anfangswert auf die erste Kategorie in der Kategorienliste fest. Zum Abschluss rufen Sie an create_widgets Methode.
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()
Der create_widgets Die Methode ist für das Hinzufügen von UI-Komponenten zu Ihrer App verantwortlich. Erstellen Sie einen Rahmen für die Beschriftungen und Einträge des Spesendatensatzes. Erstellen Sie sechs Beschriftungen: jeweils eine für die Überschrift, den Ausgabenbetrag, die Artikelbeschreibung, die Kategorie, das Datum und die Gesamtausgabe. Legen Sie für jedes Element das übergeordnete Element, den anzuzeigenden Text und den Schriftstil fest.
Erstellen Sie drei Eintrags-Widgets und ein Kombinationsfeld um die entsprechende Eingabe zu erhalten. Legen Sie für die Eintrags-Widgets das übergeordnete Element, den Schriftstil und die Breite fest. Definieren Sie das übergeordnete Element, die Werteliste, den Schriftstil und die Breite für das Kombinationsfeld. Binden Kategorie_var hinzugefügt, sodass der ausgewählte Wert automatisch aktualisiert wird.
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)
Definieren Sie fünf Schaltflächen: Kosten hinzufügen, Ausgabe bearbeiten, Ausgabe löschen, Sparen Sie Kosten, Und Ausgabendiagramm anzeigen. Legen Sie jeweils das übergeordnete Element, den anzuzeigenden Text und den Befehl fest, den es ausführt, wenn Sie darauf klicken. Erstellen Sie einen Rahmen für die Listbox. Legen Sie das übergeordnete Element, den Schriftstil und die Breite fest.
Erstellen Sie eine vertikale Bildlaufleiste und platzieren Sie sie auf der rechten Seite des Rahmens. Verwenden Sie es, um durch den Inhalt der Listbox zu scrollen. Ordnen Sie alle Elemente mit der erforderlichen Polsterung und Aufforderung an 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()
Definieren Sie die Funktionalität des Spesen-Trackers
Definieren Sie eine Methode, add_expense. Rufen Sie den Wert der Ausgabe, des Artikels, der Kategorie und des Datums ab. Wenn der Wert der Ausgabe und das Datum gültig sind, addieren Sie die Ausgabe zum Kosten Liste. Fügen Sie diesen Datensatz in die Listbox ein und formatieren Sie ihn entsprechend. Nach dem Einfügen löschen Sie die Benutzereingaben in den Eingabefeldern für neue Eingaben.
Andernfalls wird eine Warnung angezeigt, dass die Werte für Ausgaben und Datum nicht leer sein dürfen. Anruf 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()
Definieren Sie eine Methode, edit_expense. Rufen Sie den Index des ausgewählten Datensatzes ab und ermitteln Sie die Ausgabe. Öffnen Sie ein Dialogfeld, in dem Sie aufgefordert werden, die Ausgaben einzugeben. Wenn der Benutzer eine neue Ausgabe angegeben hat, ändern Sie die Ausgabenliste entsprechend. Ruf den Liste aktualisieren Und 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()
Definieren Sie eine Methode, delete_expense. Rufen Sie den Index des ausgewählten Datensatzes ab und ermitteln Sie die Ausgabe. Übergeben Sie den Index des Eintrags, den Sie löschen möchten. Löschen Sie diesen Eintrag aus der Listbox und rufen Sie den auf 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()
Definieren Sie eine Methode, Liste aktualisieren. Löschen Sie den vorhandenen Datensatz und fügen Sie stattdessen einen neuen Datensatz mit den aktualisierten Werten hinzu.
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})"
)
Definieren Sie eine Methode, update_total_label. Berechnen Sie die Summe aller Ausgaben in der Liste und aktualisieren Sie sie auf dem Etikett. Definieren Sie eine andere Methode, save_expenses. Erstellen und öffnen Sie eine CSV Datei mit dem Namen Ausgaben.csv im Schreibmodus. Fügen Sie der CSV-Datei als erste Zeile Spaltenüberschriften hinzu. Durchlaufen Sie jeden Spesendatensatz und schreiben Sie ihn als Zeile.
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))
Definieren Sie eine Methode, show_expenses_chart. Definieren Sie ein Wörterbuch, Kategorie_Gesamtsummen. Durchlaufen Sie die Kosten Listen Sie den Ausgabenbetrag auf und konvertieren Sie ihn in einen Float-Betrag. Speichern Sie den Gesamtausgabenbetrag für jede Kategorie. Wenn die Kategorie bereits im Wörterbuch vorhanden ist, erhöhen Sie die Gesamtsumme um den aktuellen Ausgabenbetrag. Andernfalls erstellen Sie einen neuen Eintrag mit dem aktuellen Ausgabenbetrag.
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
Extrahieren Sie die Kategorien und die Ausgaben in zwei verschiedene Listen. Erstellen Sie eine neue Figur für den Plot mit der angegebenen Größe. Erstellen Sie ein Kreisdiagramm, indem Sie die Ausgabenliste als Daten und die Kategorieliste als Beschriftung verwenden. Der Autoteil Der Parameter gibt das Format für die Anzeige der Prozentwerte in den Diagrammsegmenten an. Passieren gleich Zu Plt.Achse um sicherzustellen, dass Sie das Kreisdiagramm als Kreis zeichnen. Legen Sie den Titel des Kreisdiagramms fest und zeigen Sie es an.
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()
Erstellen Sie eine Instanz von ExpenseTrackerApp Klasse. Der Hauptschleife() Die Funktion weist Python an, die Tkinter-Ereignisschleife auszuführen und auf Ereignisse zu warten, bis Sie das Fenster schließen.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Testen Sie verschiedene Funktionen des Python Expense Tracker
Wenn Sie das Programm ausführen, wird ein Anwendungsfenster geöffnet. Dieses verfügt über Eingabefelder zur Erfassung der Ausgabe, der Artikelbeschreibung, der Kategorie und des Datums. Geben Sie einige Daten ein und klicken Sie auf Kosten hinzufügen Taste; Sie werden sehen, dass der Datensatz zum Listenfeld hinzugefügt wird. Das Programm aktualisiert auch die Gesamtausgaben.
Wählen Sie einen Datensatz aus und klicken Sie auf Ausgaben bearbeiten Taste. Es erscheint ein Dialogfeld, in dem Sie den einzelnen Datensatz aktualisieren können.
Klicken Sie auf Ausgaben löschen Klicken Sie auf die Schaltfläche, um den ausgewählten Datensatz zu entfernen.
Beim Schlagen des Ausgabendiagramm anzeigen Wenn Sie auf die Schaltfläche klicken, zeigt das Programm ein Kreisdiagramm an. Das Kreisdiagramm zeigt die Ausgaben für jede Kategorie zusammen mit ihrem Namen und Prozentsatz an.
Verbesserung des Spesen-Trackers
Sie können eine Suchfunktion hinzufügen, damit Benutzer bestimmte Ausgaben anhand ihrer Beschreibung, ihres Betrags, ihrer Kategorie oder ihres Datums finden können. Sie können eine Option zum Sortieren und Filtern von Datensätzen hinzufügen. Lokalisieren Sie die App, um verschiedene Sprachen und Währungsformate zu unterstützen.
Sie können die App auch um Unterstützung für Benachrichtigungen erweitern. Ermöglichen Sie dem Benutzer, Benachrichtigungen einzurichten, um zu verhindern, dass Budgetgrenzen überschritten werden, oder um ungewöhnliche Ausgaben hervorzuheben.