Δημιουργήστε αυτήν την απλή εφαρμογή για να εξασκηθείτε στον μαθηματικό προγραμματισμό σας και να μάθετε λίγα πράγματα για την κωδικοποίηση GUI στην πορεία.

Η παρακολούθηση εξόδων είναι ένα ουσιαστικό εργαλείο που βοηθά τα άτομα και τις επιχειρήσεις να διαχειρίζονται τις οικονομικές τους συναλλαγές. Με έναν ανιχνευτή εξόδων, μπορείτε να δημιουργήσετε προϋπολογισμούς, να κατηγοριοποιήσετε τα έξοδα και να αναλύσετε μοτίβα δαπανών.

Μάθετε πώς να δημιουργήσετε μια εφαρμογή παρακολούθησης εξόδων, με ένα γραφικό περιβάλλον εργασίας μεταξύ πλατφορμών, στην Python.

Οι ενότητες Tkinter, CSV και Matplotlib

Για να δημιουργήσετε αυτόν τον ανιχνευτή εξόδων, θα χρειαστείτε τις ενότητες Tkinter, CSV και Matplotlib.

Ο Tkinter σας επιτρέπει δημιουργία επιτραπέζιων εφαρμογών. Προσφέρει μια ποικιλία γραφικών στοιχείων όπως κουμπιά, ετικέτες και πλαίσια κειμένου που διευκολύνουν την ανάπτυξη εφαρμογών.

Η μονάδα CSV είναι μια ενσωματωμένη βιβλιοθήκη Python που παρέχει λειτουργικότητα για ανάγνωση και γραφή Αρχεία CSV (Τιμές διαχωρισμένες με κόμμα)..

instagram viewer

Με το Matplotlib, μπορείτε να δημιουργήσετε διαδραστικές απεικονίσεις, όπως γραφήματα, γραφήματα και γραφήματα. Η χρήση του με λειτουργικές μονάδες όπως το OpenCV μπορεί να σας βοηθήσει μάστερ τεχνικές βελτίωσης εικόνας πολύ.

Για να εγκαταστήσετε αυτές τις μονάδες, εκτελέστε:

pip install tk matplotlib 

Καθορίστε τη δομή της εφαρμογής παρακολούθησης εξόδων

Μπορείτε να βρείτε τον πηγαίο κώδικα αυτού του έργου σε αυτό Αποθετήριο GitHub.

Ξεκινήστε εισάγοντας τις απαραίτητες ενότητες. Ορίστε μια τάξη, ExpenseTrackerApp. Ορίστε τον τίτλο και τις διαστάσεις. Ορίστε μια λίστα για την αποθήκευση των εξόδων και μια άλλη για τις κατηγορίες. Αρχικοποίηση α StringVar ονομάστηκε category_var και ορίστε την αρχική του τιμή στην πρώτη κατηγορία στη λίστα κατηγοριών. Ολοκληρώστε καλώντας το create_widgets μέθοδος.

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

ο create_widgets Η μέθοδος είναι υπεύθυνη για την προσθήκη στοιχείων διεπαφής χρήστη στην εφαρμογή σας. Δημιουργήστε ένα πλαίσιο για τις ετικέτες και τις καταχωρήσεις της εγγραφής εξόδων. Δημιουργήστε έξι ετικέτες: μία για την επικεφαλίδα, το ποσό εξόδων, την περιγραφή του στοιχείου, την κατηγορία, την ημερομηνία και το συνολικό κόστος. Ορίστε το γονικό στοιχείο του καθενός, το κείμενο που πρέπει να εμφανίζεται και το στυλ γραμματοσειράς του.

Δημιουργήστε τρία γραφικά στοιχεία καταχώρισης και α Combobox για να λάβετε την αντίστοιχη είσοδο. Για τα γραφικά στοιχεία καταχώρισης, ορίστε το γονικό στοιχείο, το στυλ γραμματοσειράς και το πλάτος. Ορίστε το γονικό στοιχείο, τη λίστα τιμών, το στυλ γραμματοσειράς και το πλάτος για το Combobox. Δένω category_var σε αυτό, οπότε η επιλεγμένη τιμή ενημερώνεται αυτόματα.

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)

Ορίστε πέντε κουμπιά: Προσθήκη εξόδων, Επεξεργασία εξόδων, Διαγραφή Εξόδων, Εξοικονόμηση Εξόδων, και Εμφάνιση γραφήματος εξόδων. Ορίστε το γονικό στοιχείο του καθενός, το κείμενο που πρέπει να εμφανίζεται και την εντολή που θα εκτελεστεί όταν κάνετε κλικ σε αυτό. Δημιουργήστε ένα πλαίσιο για το πλαίσιο λίστας. Ορίστε το γονικό στοιχείο, το στυλ γραμματοσειράς και το πλάτος.

Δημιουργήστε μια κάθετη γραμμή κύλισης και τοποθετήστε τη στη δεξιά πλευρά του πλαισίου. Χρησιμοποιήστε το για κύλιση στα περιεχόμενα του πλαισίου λίστας. Οργανώστε όλα τα στοιχεία με τα απαραίτητα padding και call 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()

Καθορίστε τη Λειτουργικότητα του Παρακολούθησης Εξόδων

Ορίστε μια μέθοδο, add_expense. Ανακτήστε την αξία της δαπάνης, του είδους, της κατηγορίας και της ημερομηνίας. Εάν η αξία της δαπάνης και η ημερομηνία είναι έγκυρες, προσθέστε τη δαπάνη στο έξοδα λίστα. Εισαγάγετε αυτήν την εγγραφή στο πλαίσιο λίστας και μορφοποιήστε την κατάλληλα. Μόλις εισαχθεί, διαγράψτε την είσοδο χρήστη στα πλαίσια εισαγωγής για νέα εισαγωγή.

Διαφορετικά, εμφανίστε μια προειδοποίηση ότι οι τιμές του κόστους και της ημερομηνίας δεν μπορούν να είναι κενές. Κλήση 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()

Ορίστε μια μέθοδο, edit_expense. Ανακτήστε το ευρετήριο της επιλεγμένης εγγραφής και λάβετε το κόστος. Ανοίξτε ένα παράθυρο διαλόγου ζητώντας να εισαγάγετε το κόστος. Εάν ο χρήστης παρείχε νέα δαπάνη, τροποποιήστε τη λίστα εξόδων ανάλογα. Καλέστε το refresh_list και 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()

Ορίστε μια μέθοδο, delete_expense. Ανακτήστε το ευρετήριο της επιλεγμένης εγγραφής και λάβετε το κόστος. Περάστε το ευρετήριο της καταχώρισης που θέλετε να διαγράψετε. Διαγράψτε αυτήν την καταχώρηση από το πλαίσιο λίστας και καλέστε το 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()

Ορίστε μια μέθοδο, refresh_list. Διαγράψτε την υπάρχουσα εγγραφή και προσθέστε μια νέα εγγραφή με τις ενημερωμένες τιμές.

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

Ορίστε μια μέθοδο, update_total_label. Υπολογίστε το άθροισμα όλων των εξόδων στη λίστα και ενημερώστε το στην ετικέτα. Ορίστε μια άλλη μέθοδο, εξοικονομώ_έξοδα. Δημιουργία και άνοιγμα α CSV αρχείο με όνομα έξοδα.csv σε λειτουργία εγγραφής. Προσθέστε κεφαλίδες στηλών στο αρχείο CSV ως πρώτη σειρά. Επαναλάβετε πάνω από κάθε εγγραφή εξόδων και γράψτε τη ως μια σειρά.

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

Ορίστε μια μέθοδο, show_expenses_chart. Ορίστε ένα λεξικό, κατηγορία_σύνολο. Επαναλάβετε μέσω του έξοδα λίστα και μετατρέψτε το ποσό δαπάνης σε float. Αποθηκεύστε το συνολικό ποσό εξόδων για κάθε κατηγορία. Εάν η κατηγορία υπάρχει ήδη στο λεξικό, αυξήστε το σύνολο κατά το ποσό της τρέχουσας δαπάνης. Διαφορετικά, δημιουργήστε μια νέα καταχώρηση με το τρέχον ποσό εξόδων.

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

Εξαγάγετε τις κατηγορίες και τα έξοδα σε δύο διαφορετικές λίστες. Δημιουργήστε ένα νέο σχήμα για το οικόπεδο με το καθορισμένο μέγεθος. Δημιουργήστε ένα γράφημα πίτας, χρησιμοποιώντας τη λίστα εξόδων ως δεδομένα και τη λίστα κατηγοριών ως ετικέτα. ο autopct Η παράμετρος καθορίζει τη μορφή για την εμφάνιση των ποσοστιαίων τιμών στα τμήματα του γραφήματος. Πέρασμα ίσος προς την πλτ.άξονας για να διασφαλίσετε ότι σχεδιάζετε το γράφημα πίτας ως κύκλο. Ορίστε τον τίτλο του γραφήματος πίτας και εμφανίστε τον.

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

Δημιουργήστε ένα παράδειγμα του ExpenseTrackerApp τάξη. ο mainloop() Η συνάρτηση λέει στην Python να εκτελέσει τον βρόχο συμβάντων Tkinter και να ακούει συμβάντα μέχρι να κλείσει το παράθυρο.

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

Δοκιμάστε διαφορετικά χαρακτηριστικά του Python Expense Tracker

Όταν εκτελείτε το πρόγραμμα, θα ανοίξει ένα παράθυρο εφαρμογής. Αυτό έχει πεδία εισαγωγής για την καταγραφή της δαπάνης, την περιγραφή του στοιχείου, την κατηγορία και την ημερομηνία. Εισαγάγετε ορισμένα δεδομένα και κάντε κλικ στο Προσθήκη εξόδων κουμπί; θα δείτε ότι η εγγραφή προστίθεται στο πλαίσιο λίστας. Το πρόγραμμα ενημερώνει επίσης τις συνολικές δαπάνες.

Επιλέξτε μια εγγραφή και κάντε κλικ στο Επεξεργασία εξόδων κουμπί. Εμφανίζεται ένα παράθυρο διαλόγου, που σας επιτρέπει να ενημερώσετε τη μεμονωμένη εγγραφή.

Κάνοντας κλικ στο Διαγραφή Εξόδων κουμπί για να αφαιρέσετε την επιλεγμένη εγγραφή.

Στο χτύπημα του Εμφάνιση γραφήματος εξόδων κουμπί, το πρόγραμμα εμφανίζει ένα γράφημα πίτας. Το γράφημα πίτας εμφανίζει τη δαπάνη για κάθε κατηγορία μαζί με το όνομα και το ποσοστό της.

Βελτίωση του Tracker Εξόδων

Μπορείτε να προσθέσετε λειτουργία αναζήτησης για να επιτρέψετε στους χρήστες να βρίσκουν συγκεκριμένα έξοδα με βάση την περιγραφή, το ποσό, την κατηγορία ή την ημερομηνία τους. Μπορείτε να προσθέσετε μια επιλογή για ταξινόμηση και φιλτράρισμα εγγραφών. Εντοπίστε την εφαρμογή για να υποστηρίζει διαφορετικές γλώσσες και μορφές νομισμάτων.

Θα μπορούσατε επίσης να επεκτείνετε την εφαρμογή με υποστήριξη για ειδοποιήσεις. Αφήστε τον χρήστη να ρυθμίσει ειδοποιήσεις για να τους αποτρέψει από την υπέρβαση των ορίων του προϋπολογισμού ή να τονίσει τυχόν ασυνήθιστες δαπάνες.