Sukurkite šią paprastą programą, kad galėtumėte praktikuoti matematikos programavimą ir šiek tiek sužinoti apie GUI kodavimą.
Išlaidų stebėjimo priemonė yra būtina priemonė, padedanti asmenims ir įmonėms valdyti savo finansines operacijas. Naudodami išlaidų stebėjimo priemonę galite kurti biudžetus, suskirstyti išlaidas į kategorijas ir analizuoti išlaidų modelius.
Sužinokite, kaip Python sukurti išlaidų stebėjimo programą su kelių platformų GUI.
Tkinter, CSV ir Matplotlib moduliai
Norėdami sukurti šį išlaidų stebėjimo įrenginį, jums reikės Tkinter, CSV ir Matplotlib modulių.
Tkinter leidžia jums kurti darbalaukio programas. Jame siūlomi įvairūs valdikliai, pvz., mygtukai, etiketės ir teksto laukeliai, kurie palengvina programų kūrimą.
CSV modulis yra integruota Python biblioteka, kuri suteikia skaitymo ir rašymo funkcionalumą CSV (kableliais atskirtų reikšmių) failai.
Naudodami Matplotlib galite kurti interaktyvias vizualizacijas, pvz., grafikus, brėžinius ir diagramas. Naudojant jį su moduliais, tokiais kaip OpenCV, gali padėti įvaldyti vaizdo gerinimo metodus taip pat.
Norėdami įdiegti šiuos modulius, paleiskite:
pip install tk matplotlib
Apibrėžkite „Expense Tracker“ programos struktūrą
Šio projekto šaltinio kodą galite rasti jame GitHub saugykla.
Pradėkite importuodami reikalingus modulius. Apibrėžkite klasę, ExpenseTrackerApp. Nustatykite pavadinimą ir matmenis. Apibrėžkite sąrašą išlaidoms saugoti ir kitą kategorijoms. Inicijuoti a StringVar pavadintas kategorijos_var ir nustatykite jo pradinę reikšmę į pirmąją kategorijų sąrašo kategoriją. Užbaikite paskambinę sukurti_valdiklius metodas.
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 sukurti_valdiklius metodas yra atsakingas už vartotojo sąsajos komponentų įtraukimą į jūsų programą. Sukurkite išlaidų įrašo etikečių ir įrašų rėmelį. Sukurkite šešias etiketes: po vieną antraštei, išlaidų sumai, prekės aprašymui, kategorijai, datai ir visoms išlaidoms. Nustatykite kiekvieno pirminį elementą, tekstą, kurį jis turi rodyti, ir šrifto stilių.
Sukurkite tris įrašų valdiklius ir a Combobox kad gautumėte atitinkamą įvestį. Įvesties valdikliams nustatykite pirminį elementą, šrifto stilių ir plotį. Apibrėžkite pirminį elementą, reikšmių sąrašą, šrifto stilių ir plotį Combobox. Įpareigoti kategorijos_var į jį, todėl pasirinkta reikšmė automatiškai atnaujinama.
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)
Apibrėžkite penkis mygtukus: Pridėti išlaidas, Redaguoti išlaidas, Ištrinti išlaidas, Sutaupykite išlaidas, ir Rodyti išlaidų diagramą. Nustatykite kiekvieno elemento pirminį elementą, tekstą, kuris turi būti rodomas, ir komandą, kuri bus paleista spustelėjus. Sukurkite sąrašo laukelio rėmelį. Nustatykite pirminį elementą, šrifto stilių ir plotį.
Sukurkite vertikalią slinkties juostą ir padėkite ją dešinėje rėmelio pusėje. Naudokite jį norėdami slinkti sąrašo laukelio turinį. Sutvarkykite visus elementus su reikiamu užpildu ir skambinkite 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()
Apibrėžkite išlaidų stebėjimo priemonės funkcionalumą
Apibrėžkite metodą, pridėti_išlaidos. Gaukite išlaidų, prekės, kategorijos ir datos vertę. Jei išlaidų vertė ir data galioja, pridėkite išlaidas prie išlaidas sąrašą. Įdėkite šį įrašą į sąrašo laukelį ir tinkamai suformatuokite. Įdėję ištrinkite vartotojo įvestį naujos įvesties laukeliuose.
Kitu atveju parodykite įspėjimą, kad išlaidų ir datos reikšmės negali būti tuščios. Skambinti 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()
Apibrėžkite metodą, edit_expense. Gaukite pasirinkto įrašo rodyklę ir gaukite išlaidas. Atidarykite dialogo langą, kuriame prašoma įvesti išlaidas. Jei vartotojas nurodė naujas išlaidas, atitinkamai pakeiskite išlaidų sąrašą. Paskambinkite į atnaujinti sąrašą ir 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()
Apibrėžkite metodą, ištrinti_išlaidas. Gaukite pasirinkto įrašo rodyklę ir gaukite išlaidas. Perduokite įrašo, kurį norite ištrinti, rodyklę. Ištrinkite šį įrašą iš sąrašo laukelio ir skambinkite 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()
Apibrėžkite metodą, atnaujinti sąrašą. Ištrinkite esamą įrašą ir pridėkite naują įrašą su atnaujintomis reikšmėmis.
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})"
)
Apibrėžkite metodą, update_total_label. Apskaičiuokite visų sąraše esančių išlaidų sumą ir atnaujinkite ją etiketėje. Apibrėžkite kitą metodą, taupyti_išlaidas. Sukurkite ir atidarykite a CSV failas pavadintas išlaidos.csv rašymo režimu. Pridėkite stulpelių antraštes į CSV failą kaip pirmąją eilutę. Pakartokite kiekvieną išlaidų įrašą ir parašykite jį kaip eilutę.
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))
Apibrėžkite metodą, rodyti_išlaidų_grafiką. Apibrėžkite žodyną, kategorijų_iš viso. Pakartokite per išlaidas sąrašą ir konvertuoti išlaidų sumą į plūduriuojančią. Išsaugokite bendrą kiekvienos kategorijos išlaidų sumą. Jei kategorija jau yra žodyne, padidinkite bendrą sumą dabartine išlaidų suma. Kitu atveju sukurkite naują įrašą su dabartine išlaidų suma.
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
Išskirkite kategorijas ir išlaidas į du skirtingus sąrašus. Sukurkite naują nurodyto dydžio sklypo figūrą. Sukurkite skritulinę diagramą naudodami išlaidų sąrašą kaip duomenis ir kategorijų sąrašą kaip etiketę. The autopct parametras nurodo procentinių verčių rodymo diagramos pjūviuose formatą. Praeiti lygus į plt.axis kad įsitikintumėte, jog skritulinę diagramą nubraižėte kaip apskritimą. Nustatykite skritulinės diagramos pavadinimą ir parodykite jį.
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()
Sukurkite egzempliorių ExpenseTrackerApp klasė. The mainloop () funkcija liepia Python paleisti Tkinter įvykių kilpą ir klausytis įvykių, kol uždarysite langą.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Išbandykite įvairias „Python Expense Tracker“ funkcijas
Kai paleisite programą, bus paleistas programos langas. Čia yra įvesties laukai, skirti įrašyti išlaidas, prekės aprašymą, kategoriją ir datą. Įveskite kai kuriuos duomenis ir spustelėkite Pridėti išlaidas mygtukas; pamatysite, kad įrašas bus įtrauktas į sąrašo laukelį. Programa taip pat atnaujina visas išlaidas.
Pasirinkite įrašą ir spustelėkite Redaguoti išlaidas mygtuką. Pasirodo dialogo langas, kuriame galėsite atnaujinti atskirą įrašą.
Paspaudę Ištrinti išlaidas mygtuką, kad pašalintumėte pasirinktą įrašą.
Pataikius į Rodyti išlaidų diagramą mygtuką, programa rodo skritulinę diagramą. Skritulinėje diagramoje rodomos kiekvienos kategorijos išlaidos kartu su jos pavadinimu ir procentais.
Išlaidų stebėjimo priemonės tobulinimas
Galite pridėti paieškos funkciją, kad naudotojai rastų konkrečias išlaidas pagal jų aprašymą, sumą, kategoriją ar datą. Galite pridėti įrašų rūšiavimo ir filtravimo parinktį. Lokalizuokite programą, kad ji palaikytų skirtingas kalbas ir valiutos formatus.
Taip pat galite išplėsti programą palaikydami pranešimus. Leiskite naudotojui nustatyti įspėjimus, kad jie neviršytų biudžeto limitų arba nepabrėžtų neįprastų išlaidų.