Ehitage see lihtne rakendus, et harjutada oma matemaatika programmeerimist ja õppida sellel teel GUI kodeerimise kohta.

Kulude jälgija on oluline tööriist, mis aitab üksikisikutel ja ettevõtetel oma finantstehinguid hallata. Kulujälgija abil saate koostada eelarveid, kategoriseerida kulusid ja analüüsida kulumustreid.

Siit saate teada, kuidas Pythonis luua platvormideülese GUI-ga kulujälgija rakendus.

Tkinteri, CSV ja Matplotlib moodulid

Selle kulujälgija loomiseks vajate mooduleid Tkinter, CSV ja Matplotlib.

Tkinter võimaldab teil luua töölauarakendusi. See pakub mitmesuguseid vidinaid, nagu nupud, sildid ja tekstikastid, mis muudavad rakenduste arendamise lihtsaks.

CSV-moodul on sisseehitatud Pythoni teek, mis pakub lugemis- ja kirjutamisfunktsioone CSV-failid (komaeraldusega väärtused)..

Matplotlibiga saate luua interaktiivseid visualiseerimisi, nagu graafikud, graafikud ja diagrammid. Selle kasutamine moodulitega nagu OpenCV võib teid aidata meisterdada pildi parandamise tehnikaid ka.

Nende moodulite installimiseks käivitage:

instagram viewer
pip install tk matplotlib 

Määratlege kulujälgija rakenduse struktuur

Selle projekti lähtekoodi leiate sellest GitHubi hoidla.

Alustage vajalike moodulite importimisega. Määratlege klass, ExpenseTrackerApp. Määrake pealkiri ja mõõtmed. Määratlege loend kulude salvestamiseks ja teine ​​​​kategooriate jaoks. Initsialiseeri a StringVar nimega kategooria_var ja määrake selle algväärtus kategooriate loendi esimesele kategooriale. Lõpetage helistades loo_vidinad meetod.

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 loo_vidinad meetod vastutab teie rakendusele kasutajaliidese komponentide lisamise eest. Looge kulukirje siltide ja kannete jaoks raam. Looge kuus silti: üks pealkirja, kulusumma, kauba kirjelduse, kategooria, kuupäeva ja kogukulu jaoks. Määrake iga emaelement, tekst, mida see peaks kuvama, ja selle fondi stiil.

Loo kolm sisestusvidinat ja a Kombokast vastava sisendi saamiseks. Kirjevidinate jaoks määrake ülemelement, fondi stiil ja laius. Määrake lähteelement, väärtuste loend, fondi stiil ja laius Kombokast. Seo kategooria_var sellele, nii et valitud väärtust värskendatakse automaatselt.

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)

Määratlege viis nuppu: Lisa kulu, Muuda kulusid, Kustuta kulud, Säästke kulusidja Näita kulude tabelit. Määrake iga elemendi ülemelement, tekst, mida see peaks kuvama, ja käsk, mida see käivitab, kui klõpsate sellel. Looge loendikasti raam. Määrake emaelement, fondi stiil ja laius.

Looge vertikaalne kerimisriba ja asetage see raami paremale küljele. Kasutage seda loendikasti sisu sirvimiseks. Korraldage kõik elemendid vajaliku polsterdusega ja helistage 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()

Määratlege kulujälgija funktsionaalsus

Määratlege meetod, add_expense. Hankige kulu, kauba, kategooria ja kuupäeva väärtus. Kui kulu väärtus ja kuupäev kehtivad, lisage kulu kulud nimekirja. Sisestage see kirje loendikasti ja vormindage see sobivalt. Pärast sisestamist kustutage kasutaja sisestus uue sisendi sisestuskastidest.

Vastasel juhul kuvatakse hoiatus, et kulu ja kuupäeva väärtused ei tohi olla tühjad. Helistama 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()

Määratlege meetod, muuda_kulu. Hankige valitud kirje indeks ja hankige kulu. Avage dialoogiboks, milles palutakse kulu sisestada. Kui kasutaja esitas uue kulu, muutke kulude loendit vastavalt. Helistage värskenda_loendit ja 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()

Määratlege meetod, kustuta_kulu. Hankige valitud kirje indeks ja hankige kulu. Edastage kustutatava kirje register. Kustutage see kirje loendikastist ja helistage 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()

Määratlege meetod, värskenda_loendit. Kustutage olemasolev kirje ja lisage selle asemel uus kirje värskendatud väärtustega.

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

Määratlege meetod, update_total_label. Arvutage välja kõigi loendis olevate kulude summa ja värskendage seda sildil. Määrake teine ​​meetod, sääst_kulud. Looge ja avage a CSV faili nimega kulud.csv kirjutamisrežiimis. Lisage veerupäised CSV-faili esimese reana. Korrake iga kulukirjet ja kirjutage see reana.

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

Määratlege meetod, näita_kulude_tabelit. Määratle sõnaraamat, kategooria_kokku. Korda läbi kulud loetleda ja teisendada kulusumma ujuvaks. Salvestage iga kategooria kulu kogusumma. Kui kategooria on sõnastikus juba olemas, suurendage kogusummat jooksva kulusumma võrra. Vastasel juhul looge uus kirje praeguse kulusummaga.

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

Eraldage kategooriad ja kulud kahte erinevasse loendisse. Looge krundile määratud suurusega uus kujund. Looge sektordiagramm, kasutades andmetena kulude loendit ja sildina kategooriate loendit. The autopct parameeter määrab diagrammi lõikudel protsendiväärtuste kuvamise vormingu. Üle andma võrdne juurde plt.telg veendumaks, et joonistate sektordiagrammi ringina. Määrake sektordiagrammi pealkiri ja kuvage see.

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

Loo eksemplar ExpenseTrackerApp klass. The mainloop() funktsioon käsib Pythonil käivitada Tkinteri sündmusetsükli ja kuulata sündmusi, kuni sulgete akna.

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

Testige Pythoni kulujälgija erinevaid funktsioone

Kui käivitate programmi, käivitab see rakenduse akna. Sellel on sisestusväljad kulu, kauba kirjelduse, kategooria ja kuupäeva salvestamiseks. Sisestage mõned andmed ja klõpsake nuppu Lisa kulu nupp; näete, et kirje lisatakse loendikasti. Programm uuendab ka kogukulusid.

Valige kirje ja klõpsake nuppu Muuda kulusid nuppu. Ilmub dialoogiboks, mis võimaldab teil üksikut kirjet värskendada.

Klõpsates Kustutage kulud nuppu valitud kirje eemaldamiseks.

Löömisel Näita kulude tabelit nuppu, kuvab programm sektordiagrammi. Sektordiagramm kuvab iga kategooria kulu koos selle nime ja protsendiga.

Kulujälgija täiustamine

Saate lisada otsingufunktsiooni, mis võimaldab kasutajatel leida konkreetseid kulusid nende kirjelduse, summa, kategooria või kuupäeva alusel. Saate lisada kirjete sortimise ja filtreerimise võimaluse. Lokaliseerige rakendus, et toetada erinevaid keeli ja valuutavorminguid.

Samuti saate rakendust laiendada teatiste toega. Laske kasutajal seadistada hoiatusi, et vältida eelarvelimiitide ületamist või tõsta esile ebatavalisi kulutusi.