Zbuduj tę prostą aplikację, aby ćwiczyć programowanie matematyczne i przy okazji dowiedzieć się trochę o kodowaniu GUI.
Narzędzie do śledzenia wydatków to niezbędne narzędzie, które pomaga osobom fizycznym i firmom zarządzać transakcjami finansowymi. Dzięki narzędziu do śledzenia wydatków możesz tworzyć budżety, kategoryzować wydatki i analizować wzorce wydatków.
Dowiedz się, jak zbudować aplikację do śledzenia wydatków z wieloplatformowym graficznym interfejsem użytkownika w języku Python.
Moduły Tkinter, CSV i Matplotlib
Aby zbudować ten moduł do śledzenia wydatków, będziesz potrzebować modułów Tkinter, CSV i Matplotlib.
Tkinter pozwala tworzyć aplikacje desktopowe. Oferuje różnorodne widżety, takie jak przyciski, etykiety i pola tekstowe, które ułatwiają tworzenie aplikacji.
Moduł CSV to wbudowana biblioteka Pythona, która zapewnia funkcjonalność czytania i pisania Pliki CSV (wartości rozdzielane przecinkami)..
Dzięki Matplotlib możesz tworzyć interaktywne wizualizacje, takie jak wykresy, wykresy i wykresy. Używanie go z modułami takimi jak OpenCV może ci pomóc
mistrzowskie techniki ulepszania obrazu zbyt.Aby zainstalować te moduły, uruchom:
pip install tk matplotlib
Zdefiniuj strukturę aplikacji do śledzenia wydatków
Kod źródłowy tego projektu można znaleźć w jego pliku Repozytorium GitHuba.
Rozpocznij od zaimportowania niezbędnych modułów. Zdefiniuj klasę, Aplikacja do śledzenia wydatków. Ustaw tytuł i wymiary. Zdefiniuj listę do przechowywania wydatków i drugą dla kategorii. Zainicjuj a StringVar o imieniu kategoria_zmienna i ustaw jego wartość początkową na pierwszą kategorię na liście kategorii. Zakończ, dzwoniąc pod numer utwórz_widgety metoda.
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 utwórz_widgety metoda jest odpowiedzialna za dodanie komponentów interfejsu użytkownika do Twojej aplikacji. Utwórz ramkę dla etykiet i wpisów rekordu wydatków. Utwórz sześć etykiet: po jednej dla nagłówka, kwoty wydatku, opisu przedmiotu, kategorii, daty i całkowitego wydatku. Ustaw element nadrzędny każdego z nich, tekst, który powinien wyświetlać, i styl czcionki.
Utwórz trzy widżety wejściowe i a Combobox aby uzyskać odpowiednie dane wejściowe. W przypadku widżetów wejściowych ustaw element nadrzędny, styl czcionki i szerokość. Zdefiniuj element nadrzędny, listę wartości, styl czcionki i szerokość Combobox. Wiązać kategoria_zmienna do niego, więc wybrana wartość zostanie automatycznie zaktualizowana.
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)
Zdefiniuj pięć przycisków: Dodaj wydatek, Edytuj wydatek, Usuń wydatek, Oszczędzaj wydatki, I Pokaż wykres wydatków. Ustaw element nadrzędny każdego elementu, tekst, który powinien być wyświetlany, oraz polecenie, które zostanie uruchomione po kliknięciu. Utwórz ramkę dla pola listy. Ustaw element nadrzędny, styl czcionki i szerokość.
Utwórz pionowy pasek przewijania i umieść go po prawej stronie ramki. Użyj go, aby przewijać zawartość pola listy. Uporządkuj wszystkie elementy za pomocą niezbędnego dopełnienia i wywołania 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()
Zdefiniuj funkcjonalność modułu śledzenia wydatków
Zdefiniuj metodę, dodaj_wydatek. Pobierz wartość wydatku, pozycji, kategorii i daty. Jeżeli wartość wydatku i data są prawidłowe, należy dodać wydatek do wydatki lista. Wstaw ten rekord do pola listy i odpowiednio go sformatuj. Po wstawieniu usuń dane wprowadzone przez użytkownika w polach wprowadzania nowych danych.
W przeciwnym razie wyświetl ostrzeżenie, że wartości wydatku i daty nie mogą być puste. Dzwonić aktualizacja_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()
Zdefiniuj metodę, edycja_wydatków. Pobierz indeks wybranego rekordu i uzyskaj wydatek. Otwórz okno dialogowe z prośbą o wprowadzenie wydatku. Jeżeli użytkownik podał nowy wydatek, należy odpowiednio zmienić listę wydatków. Zadzwoń do Odśwież listę I aktualizacja_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()
Zdefiniuj metodę, usuń_wydatek. Pobierz indeks wybranego rekordu i uzyskaj wydatek. Przekaż indeks wpisu, który chcesz usunąć. Usuń ten wpis z listy i wywołaj metodę aktualizacja_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()
Zdefiniuj metodę, Odśwież listę. Usuń istniejący rekord i zamiast tego dodaj nowy rekord ze zaktualizowanymi wartościami.
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})"
)
Zdefiniuj metodę, aktualizacja_total_label. Oblicz sumę wszystkich wydatków na liście i zaktualizuj ją na etykiecie. Zdefiniuj inną metodę, oszczędzaj_wydatki. Utwórz i otwórz plik a CSV plik o nazwie wydatki.csv w trybie zapisu. Dodaj nagłówki kolumn do pliku CSV jako pierwszy wiersz. Wykonaj iterację po każdym rekordzie wydatków i zapisz go w wierszu.
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))
Zdefiniuj metodę, pokaż_wykres_wydatków. Zdefiniuj słownik, kategoria_sumy. Iteruj przez wydatki wylistuj i przekonwertuj kwotę wydatku na zmienną. Przechowuj całkowitą kwotę wydatków dla każdej kategorii. Jeśli kategoria już istnieje w słowniku, zwiększ sumę o aktualną kwotę wydatku. W przeciwnym razie utwórz nowy wpis z bieżącą kwotą wydatku.
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
Wyodrębnij kategorie i wydatki na dwie różne listy. Utwórz nową figurę dla wykresu o określonym rozmiarze. Wygeneruj wykres kołowy, używając listy wydatków jako danych i listy kategorii jako etykiety. The autopkt Parametr określa format wyświetlania wartości procentowych na wycinkach wykresu. Przechodzić równy Do oś plt aby mieć pewność, że wykres kołowy zostanie narysowany jako okrąg. Ustaw tytuł wykresu kołowego i wyświetl go.
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()
Utwórz instancję Aplikacja do śledzenia wydatków klasa. The główna pętla() funkcja mówi Pythonowi, aby uruchomił pętlę zdarzeń Tkinter i nasłuchiwał zdarzeń, dopóki nie zamkniesz okna.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
Przetestuj różne funkcje narzędzia do śledzenia wydatków w języku Python
Po uruchomieniu program otworzy okno aplikacji. Zawiera pola wejściowe do rejestrowania wydatku, opisu pozycji, kategorii i daty. Wprowadź dane i kliknij Dodaj wydatek przycisk; zobaczysz, że rekord zostanie dodany do pola listy. Program aktualizuje również łączne wydatki.
Wybierz rekord i kliknij Edytuj wydatki przycisk. Pojawi się okno dialogowe umożliwiające aktualizację pojedynczego rekordu.
Klikając Usuń wydatki przycisk, aby usunąć wybrany rekord.
Po uderzeniu Pokaż wykres wydatków przycisk, program wyświetli wykres kołowy. Wykres kołowy przedstawia wydatki dla każdej kategorii wraz z jej nazwą i wartością procentową.
Ulepszanie narzędzia do śledzenia wydatków
Możesz dodać funkcję wyszukiwania, aby umożliwić użytkownikom znajdowanie konkretnych wydatków na podstawie ich opisu, kwoty, kategorii lub daty. Możesz dodać opcję sortowania i filtrowania rekordów. Zlokalizuj aplikację, aby obsługiwała różne języki i formaty walut.
Możesz także rozszerzyć aplikację o obsługę powiadomień. Pozwól użytkownikowi skonfigurować alerty, które zapobiegną przekroczeniu limitów budżetowych lub podkreślą nietypowe wydatki.