Izveidojiet šo vienkāršo lietotni, lai praktizētu matemātikas programmēšanu un pa ceļam uzzinātu nedaudz par GUI kodēšanu.
Izdevumu izsekotājs ir būtisks rīks, kas palīdz privātpersonām un uzņēmumiem pārvaldīt savus finanšu darījumus. Izmantojot izdevumu izsekotāju, varat izveidot budžetus, klasificēt izdevumus un analizēt tēriņu modeļus.
Uzziniet, kā Python izveidot izdevumu izsekošanas lietotni ar vairāku platformu GUI.
Tkinter, CSV un Matplotlib moduļi
Lai izveidotu šo izdevumu izsekotāju, jums būs nepieciešami moduļi Tkinter, CSV un Matplotlib.
Tkinter ļauj jums izveidot darbvirsmas lietojumprogrammas. Tas piedāvā dažādus logrīkus, piemēram, pogas, etiķetes un tekstlodziņus, kas atvieglo lietotņu izstrādi.
CSV modulis ir iebūvēta Python bibliotēka, kas nodrošina lasīšanas un rakstīšanas funkcionalitāti CSV (komatatdalīto vērtību) faili.
Izmantojot Matplotlib, varat izveidot interaktīvas vizualizācijas, piemēram, grafikus, diagrammas un diagrammas. Izmantojot to ar tādiem moduļiem kā OpenCV, tas var jums palīdzēt apgūt attēla uzlabošanas paņēmienus arī.
Lai instalētu šos moduļus, palaidiet:
pip install tk matplotlib
Definējiet Expense Tracker App struktūru
Jūs varat atrast šī projekta pirmkodu tajā GitHub repozitorijs.
Sāciet ar nepieciešamo moduļu importēšanu. Definējiet klasi, ExpenseTrackerApp. Iestatiet nosaukumu un izmērus. Definējiet sarakstu, lai saglabātu izdevumus, un citu - kategorijām. Inicializēt a StringVar nosaukts kategorijas_var un iestatiet tā sākotnējo vērtību uz pirmo kategoriju kategoriju sarakstā. Pabeidziet, zvanot uz Create_widgets metodi.
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 Create_widgets metode ir atbildīga par lietotāja interfeisa komponentu pievienošanu jūsu lietotnei. Izveidojiet rāmi izdevumu ieraksta etiķetēm un ierakstiem. Izveidojiet sešas etiķetes: pa vienai virsrakstam, izdevumu summai, preces aprakstam, kategorijai, datumam un kopējiem izdevumiem. Iestatiet katra vecāka elementu, tekstu, kas tam jāparāda, un tā fonta stilu.
Izveidojiet trīs ierakstu logrīkus un a Kombinētais lodziņš lai iegūtu atbilstošo ievadi. Ievades logrīkiem iestatiet vecākelementu, fonta stilu un platumu. Definējiet vecākelementu, vērtību sarakstu, fonta stilu un platumu Kombinētais lodziņš. Saistīt kategorijas_var uz to, tāpēc atlasītā vērtība tiek automātiski atjaunināta.
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)
Definējiet piecas pogas: Pievienot izdevumus, Rediģēt izdevumus, Dzēst izdevumus, Ietaupiet izdevumus, un Rādīt izdevumu diagrammu. Iestatiet katra elementa vecāku elementu, tekstu, kas tam jāparāda, un komandu, kas tiks izpildīta, noklikšķinot uz tās. Izveidojiet rāmi sarakstlodziņam. Iestatiet vecākelementu, fonta stilu un platumu.
Izveidojiet vertikālu ritjoslu un novietojiet to rāmja labajā pusē. Izmantojiet to, lai ritinātu sarakstu lodziņa saturu. Sakārtojiet visus elementus ar nepieciešamo polsterējumu un zvaniet 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()
Definējiet izdevumu izsekotāja funkcionalitāti
Definējiet metodi, add_expense. Izgūstiet izdevumu, preces, kategorijas un datuma vērtību. Ja izdevumu vērtība un datums ir spēkā, pievienojiet izdevumus izdevumiem sarakstu. Ievietojiet šo ierakstu sarakstlodziņā un atbilstoši formatējiet to. Pēc ievietošanas izdzēsiet lietotāja ievadīto ievades lodziņos jaunai ievadei.
Pretējā gadījumā parādiet brīdinājumu, ka izdevumu un datuma vērtības nevar būt tukšas. Zvaniet 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()
Definējiet metodi, edit_expense. Izgūstiet atlasītā ieraksta indeksu un saņemiet izdevumus. Atveriet dialoglodziņu, kurā tiek prasīts ievadīt izdevumus. Ja lietotājs ir norādījis jaunu izdevumu, attiecīgi mainiet izdevumu sarakstu. Zvaniet uz atsvaidzināšanas_saraksts un 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()
Definējiet metodi, delete_expense. Izgūstiet atlasītā ieraksta indeksu un saņemiet izdevumus. Nododiet tā ieraksta indeksu, kuru vēlaties dzēst. Izdzēsiet šo ierakstu no sarakstlodziņa un zvaniet uz 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()
Definējiet metodi, atsvaidzināšanas_saraksts. Dzēsiet esošo ierakstu un tā vietā pievienojiet jaunu ierakstu ar atjauninātajām vērtībām.
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})"
)
Definējiet metodi, update_total_label. Aprēķiniet visu sarakstā esošo izdevumu summu un atjauniniet to uz etiķetes. Definējiet citu metodi, ietaupīt_izdevumus. Izveidojiet un atveriet a CSV fails ar nosaukumu izdevumi.csv rakstīšanas režīmā. Pievienojiet kolonnu galvenes CSV failam kā pirmo rindu. Atkārtojiet katru izdevumu ierakstu un ierakstiet to kā rindu.
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))
Definējiet metodi, parādīt_izdevumu_diagrammu. definēt vārdnīcu, kategorijas_kopējie. Atkārtojiet, izmantojot izdevumiem sarakstu un konvertējiet izdevumu summu uz peldošu. Saglabājiet kopējo izdevumu summu katrai kategorijai. Ja kategorija jau pastāv vārdnīcā, palieliniet kopējo summu par pašreizējo izdevumu summu. Pretējā gadījumā izveidojiet jaunu ierakstu ar pašreizējo izdevumu summu.
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
Izvelciet kategorijas un izdevumus divos dažādos sarakstos. Izveidojiet sižetam jaunu figūru ar norādīto izmēru. Izveidojiet sektoru diagrammu, izmantojot izdevumu sarakstu kā datus un kategoriju sarakstu kā etiķeti. The autopct parametrs norāda procentuālo vērtību rādīšanas formātu diagrammas daļās. Pass vienāds uz plt.ass lai nodrošinātu, ka sektoru diagramma tiek zīmēta kā aplis. Iestatiet sektoru diagrammas nosaukumu un parādiet to.
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()
Izveidojiet eksemplāru ExpenseTrackerApp klasē. The mainloop() funkcija liek Python palaist Tkinter notikumu cilpu un klausīties notikumus, līdz aizverat logu.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Pārbaudiet dažādas Python Expense Tracker funkcijas
Palaižot programmu, tā atvērs lietojumprogrammas logu. Tam ir ievades lauki, lai reģistrētu izdevumus, preces aprakstu, kategoriju un datumu. Ievadiet dažus datus un noklikšķiniet uz Pievienot izdevumus poga; jūs redzēsit, ka ieraksts tiks pievienots saraksta lodziņā. Programma arī atjaunina kopējos izdevumus.
Atlasiet ierakstu un noklikšķiniet uz Rediģēt izdevumus pogu. Tiek parādīts dialoglodziņš, kas ļauj atjaunināt atsevišķu ierakstu.
Noklikšķinot uz Dzēst izdevumus pogu, lai noņemtu atlasīto ierakstu.
Sitot uz Rādīt izdevumu diagrammu pogu, programma parāda sektoru diagrammu. Sektoru diagrammā tiek parādīti katras kategorijas izdevumi kopā ar tās nosaukumu un procentuālo daļu.
Izdevumu izsekotāja uzlabošana
Varat pievienot meklēšanas funkcionalitāti, lai ļautu lietotājiem atrast konkrētus izdevumus, pamatojoties uz to aprakstu, summu, kategoriju vai datumu. Varat pievienot ierakstu kārtošanas un filtrēšanas opciju. Lokalizējiet lietotni, lai atbalstītu dažādas valodas un valūtas formātus.
Varat arī paplašināt lietotni ar paziņojumu atbalstu. Ļaujiet lietotājam iestatīt brīdinājumus, lai novērstu budžeta ierobežojumu pārsniegšanu vai izceltu neparastus tēriņus.