Rakenna tämä yksinkertainen sovellus harjoitellaksesi matemaattista ohjelmointiasi ja oppiaksesi hieman GUI-koodauksesta matkan varrella.
Kustannusseuranta on olennainen työkalu, joka auttaa yksityishenkilöitä ja yrityksiä hallitsemaan taloustoimiaan. Kustannusseurannan avulla voit luoda budjetteja, luokitella kulut ja analysoida kulutustottumuksia.
Opi rakentamaan kustannusseurantasovellus, jossa on monialustainen GUI, Pythonissa.
Tkinter-, CSV- ja Matplotlib-moduulit
Tämän kuluseurannan rakentamiseen tarvitset Tkinter-, CSV- ja Matplotlib-moduulit.
Tkinter antaa sinun luoda työpöytäsovelluksia. Se tarjoaa erilaisia widgetejä, kuten painikkeita, tarroja ja tekstiruutuja, jotka helpottavat sovellusten kehittämistä.
CSV-moduuli on sisäänrakennettu Python-kirjasto, joka tarjoaa toimintoja lukemiseen ja kirjoittamiseen CSV (Comma-Separated Values) -tiedostot.
Matplotlibin avulla voit rakentaa interaktiivisia visualisointeja, kuten kaavioita, kaavioita ja kaavioita. Sen käyttäminen OpenCV: n kaltaisten moduulien kanssa voi auttaa sinua hallitsee kuvanparannustekniikat liian.
Asenna nämä moduulit suorittamalla:
pip install tk matplotlib
Määritä Expense Tracker -sovelluksen rakenne
Löydät tämän projektin lähdekoodin siitä GitHub-arkisto.
Aloita tuomalla tarvittavat moduulit. Määritä luokka, ExpenseTrackerApp. Aseta otsikko ja mitat. Määritä luettelo kulujen tallentamista varten ja toinen luokille. Alusta a StringVar nimetty kategoria_muuttuja ja aseta sen alkuarvo luokkaluettelon ensimmäiseksi kategoriaksi. Lopeta soittamalla create_widgets menetelmä.
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 menetelmä vastaa käyttöliittymäkomponenttien lisäämisestä sovellukseesi. Luo kehys kulutietueen tarroille ja merkinnöille. Luo kuusi tunnistetta: yksi otsakkeelle, kulusummalle, nimikkeen kuvaukselle, kategorialle, päivämäärälle ja kokonaiskululle. Aseta kunkin yläelementin, tekstin, jonka sen tulee näyttää, ja sen kirjasintyyliä.
Luo kolme syöttöwidgetiä ja a Yhdistelmälaatikko saadaksesi vastaavan syötteen. Aseta syöttöwidgetien pääelementti, kirjasintyyli ja leveys. Määritä pääelementti, arvoluettelo, kirjasintyyli ja leveys Yhdistelmälaatikko. Sitoa kategoria_muuttuja siihen, joten valittu arvo päivitetään automaattisesti.
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ääritä viisi painiketta: Lisää kuluja, Muokkaa kuluja, Poista kulut, Säästä kuluja, ja Näytä kulukaavio. Aseta kunkin yläelementti, teksti, jonka sen tulee näyttää, ja komento, joka suoritetaan, kun napsautat sitä. Luo kehys luetteloruudulle. Aseta pääelementti, kirjasintyyli ja leveys.
Luo pystysuora vierityspalkki ja aseta se kehyksen oikealle puolelle. Käytä sitä selataksesi luetteloruudun sisältöä. Järjestä kaikki elementit tarvittavilla pehmusteilla ja soita 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ääritä Expense Trackerin toiminnallisuus
Määritä menetelmä, add_expense. Hae kulun, kohteen, luokan ja päivämäärän arvo. Jos kulun arvo ja päivämäärä ovat voimassa, lisää kulu kulut lista. Lisää tämä tietue luetteloruutuun ja muotoile se asianmukaisesti. Kun olet lisännyt, poista käyttäjän syöte uuden syötteen syöttökentistä.
Muussa tapauksessa näyttöön tulee varoitus, että kulu- ja päivämääräarvot eivät voi olla tyhjiä. Puhelu 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ääritä menetelmä, edit_expense. Hae valitun tietueen hakemisto ja hanki kulut. Avaa valintaikkuna, jossa pyydetään syöttämään kulu. Jos käyttäjä on ilmoittanut uuden kulun, muuta kululuetteloa vastaavasti. Soita Päivitä lista 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ääritä menetelmä, delete_expense. Hae valitun tietueen hakemisto ja hanki kulut. Ohita poistettavan merkinnän hakemisto. Poista kyseinen merkintä luetteloruudusta ja soita numeroon 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ääritä menetelmä, Päivitä lista. Poista olemassa oleva tietue ja lisää sen sijaan uusi tietue päivitetyillä arvoilla.
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ääritä menetelmä, update_total_label. Laske luettelossa olevien kulujen summa ja päivitä se tarraan. Määritä toinen menetelmä, säästä_kulut. Luo ja avaa a CSV tiedosto nimeltä kulut.csv kirjoitustilassa. Lisää sarakeotsikot CSV-tiedostoon ensimmäiseksi riviksi. Toista jokainen kulutietue ja kirjoita se riviksi.
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ääritä menetelmä, näytä_kulut_kaavio. Määrittele sanakirja, kategorian_yhteensä. Iteroi läpi kulut luettele ja muunna kulusumma kelluvaksi. Tallenna kunkin luokan kokonaiskustannussumma. Jos luokka on jo olemassa sanakirjassa, lisää kokonaissummaa nykyisellä kulusummalla. Muussa tapauksessa luo uusi merkintä nykyisellä kulusummalla.
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
Pura luokat ja kulut kahteen eri luetteloon. Luo tontille uusi kuvio määritetyllä koosta. Luo ympyräkaavio käyttämällä kululuetteloa tietona ja luokkaluetteloa otsikkona. The autopct parametri määrittää muodon, jolla prosenttiarvot näytetään kaavion osissa. Kulkea yhtä suuri to plt.axis varmistaaksesi, että piirrät ympyräkaavion ympyränä. Aseta ympyräkaavion otsikko ja näytä se.
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()
Luo esiintymä ExpenseTrackerApp luokkaa. The mainloop() -toiminto käskee Pythonia suorittamaan Tkinterin tapahtumasilmukan ja kuuntelemaan tapahtumia, kunnes suljet ikkunan.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Testaa Python Expense Trackerin eri ominaisuuksia
Kun suoritat ohjelman, se käynnistää sovellusikkunan. Tässä on syöttökentät kulujen, nimikkeen kuvauksen, luokan ja päivämäärän kirjaamiseen. Syötä joitakin tietoja ja napsauta Lisää kuluja painiketta; näet, että tietue lisätään luetteloruutuun. Ohjelma päivittää myös kokonaiskulut.
Valitse tietue ja napsauta Muokkaa kuluja -painiketta. Näyttöön tulee valintaikkuna, jossa voit päivittää yksittäisen tietueen.
Napsauttamalla Poista kulut -painiketta poistaaksesi valitun tietueen.
Kun osuu Näytä kulukaavio -painiketta, ohjelma näyttää ympyräkaavion. Ympyräkaaviossa näkyy kunkin luokan kulut sekä sen nimi ja prosenttiosuus.
Kustannusseurannan parantaminen
Voit lisätä hakutoimintoja, joiden avulla käyttäjät voivat löytää tiettyjä kuluja kuvauksen, summan, luokan tai päivämäärän perusteella. Voit lisätä vaihtoehdon tietueiden lajitteluun ja suodattamiseen. Lokalisoi sovellus tukemaan eri kieliä ja valuuttamuotoja.
Voit myös laajentaa sovellusta ilmoitustuella. Anna käyttäjän määrittää hälytyksiä estääkseen häntä ylittämästä budjettirajoja tai korostamasta epätavallisia kuluja.