Bouw deze eenvoudige app om je wiskundeprogrammering te oefenen en gaandeweg iets te leren over GUI-codering.

Een onkostentracker is een essentieel hulpmiddel waarmee individuen en bedrijven hun financiële transacties kunnen beheren. Met een onkostentracker kunt u budgetten maken, uitgaven categoriseren en bestedingspatronen analyseren.

Ontdek hoe u een app voor het bijhouden van uitgaven kunt bouwen, met een platformonafhankelijke GUI, in Python.

De Tkinter-, CSV- en Matplotlib-modules

Om deze onkostentracker te bouwen, heb je de Tkinter-, CSV- en Matplotlib-modules nodig.

Tkinter laat het je toe desktop-applicaties maken. Het biedt een verscheidenheid aan widgets, zoals knoppen, labels en tekstvakken, waarmee u eenvoudig apps kunt ontwikkelen.

De CSV-module is een ingebouwde Python-bibliotheek die functionaliteit biedt voor lezen en schrijven CSV-bestanden (Comma-Separated Values)..

Met Matplotlib kunt u interactieve visualisaties maken, zoals grafieken, plots en diagrammen. Het gebruik ervan met modules zoals OpenCV kan u helpen Beheers technieken voor beeldverbetering te.

instagram viewer

Om deze modules te installeren, voert u het volgende uit:

pip install tk matplotlib 

Definieer de structuur van de Expense Tracker-app

U kunt de broncode van dit project vinden in zijn GitHub-opslagplaats.

Begin met het importeren van de benodigde modules. Definieer een klasse, ExpenseTrackerApp. Stel de titel en de afmetingen in. Definieer een lijst om de uitgaven op te slaan en een andere voor de categorieën. Initialiseer een StringVar genaamd categorie_var en stel de initiële waarde in op de eerste categorie in de categorieënlijst. Sluit af door te bellen naar het maak_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()

De maak_widgets methode is verantwoordelijk voor het toevoegen van UI-componenten aan uw app. Maak een kader voor de labels en vermeldingen van de onkostenregistratie. Maak zes labels: elk één voor de kop, het onkostenbedrag, de itembeschrijving, de categorie, de datum en de totale onkosten. Stel het bovenliggende element van elk element in, de tekst die het moet weergeven en de lettertypestijl.

Maak drie invoerwidgets en een Combobox om de overeenkomstige invoer te verkrijgen. Voor de invoerwidgets stelt u het bovenliggende element, de letterstijl en de breedte in. Definieer het bovenliggende element, de lijst met waarden, de lettertypestijl en de breedte voor het Combobox. Binden categorie_var ernaar, zodat de geselecteerde waarde automatisch wordt bijgewerkt.

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)

Definieer vijf knoppen: Kosten toevoegen, Uitgaven bewerken, Kosten verwijderen, Bespaar kosten, En Toon uitgavengrafiek. Stel het bovenliggende element van elk element in, de tekst die het moet weergeven en de opdracht die wordt uitgevoerd als u erop klikt. Maak een frame voor de keuzelijst. Stel het bovenliggende element, de lettertypestijl en de breedte in.

Maak een verticale schuifbalk en plaats deze aan de rechterkant van het frame. Gebruik het om door de inhoud van de keuzelijst te bladeren. Organiseer alle elementen met de nodige opvulling en bel 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()

Definieer de functionaliteit van de Expense Tracker

Definieer een methode, add_kosten. Haal de waarde van de uitgave, het item, de categorie en de datum op. Als de waarde van de uitgave en de datum geldig zijn, voegt u de uitgave toe aan de uitgaven lijst. Plaats dit record in de keuzelijst en formatteer het op de juiste manier. Eenmaal ingevoegd, verwijdert u de gebruikersinvoer in de invoervakken voor nieuwe invoer.

Anders geeft u een waarschuwing weer dat de waarden van onkosten en datum niet leeg mogen zijn. Telefoongesprek update_totaal_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()

Definieer een methode, edit_kosten. Haal de index van het geselecteerde record op en ontvang de kosten. Open een dialoogvenster waarin u wordt gevraagd de onkosten in te voeren. Als de gebruiker een nieuwe uitgave heeft opgegeven, wijzigt u de uitgavenlijst dienovereenkomstig. Bel de Ververs lijst En update_totaal_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()

Definieer een methode, verwijder_kosten. Haal de index van het geselecteerde record op en ontvang de kosten. Geef de index door van de vermelding die u wilt verwijderen. Verwijder dat item uit de keuzelijst en bel de update_totaal_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()

Definieer een methode, Ververs lijst. Verwijder het bestaande record en voeg in plaats daarvan een nieuw record toe met de bijgewerkte waarden.

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

Definieer een methode, update_totaal_label. Bereken de som van alle uitgaven in de lijst en werk deze bij op het etiket. Definieer een andere methode, bespaar_kosten. Maak en open een CSV bestand genaamd uitgaven.csv in schrijfmodus. Voeg kolomkoppen toe aan het CSV-bestand als de eerste rij. Herhaal elke onkostenrecord en schrijf deze als een rij.

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

Definieer een methode, show_expenses_chart. Definieer een woordenboek, categorie_totalen. Herhaal de uitgaven lijst en converteer het onkostenbedrag naar zwevend. Bewaar het totale uitgavenbedrag voor elke categorie. Als de categorie al in het woordenboek bestaat, verhoog dan het totaal met het huidige onkostenbedrag. Maak anders een nieuwe boeking met het huidige onkostenbedrag.

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

Pak de categorieën en de uitgaven uit in twee verschillende lijsten. Maak een nieuwe figuur voor de plot met de opgegeven grootte. Genereer een cirkeldiagram, gebruik de uitgavenlijst als gegevens en de categorielijst als label. De autopct parameter specificeert het formaat voor het weergeven van de percentagewaarden op de diagramsegmenten. Doorgang gelijkwaardig naar plt.as om ervoor te zorgen dat u het cirkeldiagram als een cirkel tekent. Stel de titel van het cirkeldiagram in en geef deze weer.

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

Maak een exemplaar van de ExpenseTrackerApp klas. De Hoofdlus() functie vertelt Python om de Tkinter-gebeurtenislus uit te voeren en naar gebeurtenissen te luisteren totdat je het venster sluit.

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

Test verschillende functies van de Python Expense Tracker

Wanneer u het programma uitvoert, wordt een toepassingsvenster geopend. Dit heeft invoervelden om de uitgave, de artikelbeschrijving, de categorie en de datum vast te leggen. Voer enkele gegevens in en klik op de Kosten toevoegen knop; u zult zien dat de record wordt toegevoegd aan de keuzelijst. Het programma werkt ook de totale uitgaven bij.

Selecteer een record en klik op de Uitgaven bewerken knop. Er verschijnt een dialoogvenster waarin u de individuele record kunt bijwerken.

Klik op de Kosten verwijderen knop om de geselecteerde record te verwijderen.

Bij het raken van de Toon uitgavengrafiek -knop, geeft het programma een cirkeldiagram weer. In het cirkeldiagram worden de kosten voor elke categorie weergegeven, samen met de naam en het percentage.

Verbetering van de onkostenregistratie

U kunt zoekfunctionaliteit toevoegen zodat gebruikers specifieke uitgaven kunnen vinden op basis van hun beschrijving, bedrag, categorie of datum. U kunt een optie toevoegen om records te sorteren en filteren. Lokaliseer de app om verschillende talen en valutaformaten te ondersteunen.

Ook kun je de app uitbreiden met ondersteuning voor notificaties. Laat de gebruiker waarschuwingen instellen om te voorkomen dat hij de budgetlimieten overschrijdt of om ongebruikelijke uitgaven te benadrukken.