בנה את האפליקציה הפשוטה הזו כדי לתרגל את התכנות המתמטי שלך וללמוד קצת על קידוד GUI לאורך הדרך.
מעקב אחר הוצאות הוא כלי חיוני המסייע לאנשים ועסקים לנהל את העסקאות הפיננסיות שלהם. עם מעקב אחר הוצאות, אתה יכול ליצור תקציבים, לסווג הוצאות ולנתח דפוסי הוצאות.
גלה כיצד לבנות אפליקציית מעקב אחר הוצאות, עם GUI חוצה פלטפורמות, ב-Python.
מודולי Tkinter, CSV ו-Matplotlib
כדי לבנות את עוקב ההוצאות הזה, תזדקק למודולים Tkinter, CSV ו-Matplotlib.
Tkinter מאפשר לך ליצור יישומי שולחן עבודה. הוא מציע מגוון של ווידג'טים כמו לחצנים, תוויות ותיבות טקסט שמקלים על פיתוח אפליקציות.
מודול ה-CSV הוא ספריית Python מובנית המספקת פונקציונליות לקריאה וכתיבה קבצי CSV (ערכים מופרדים בפסיק)..
עם 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)
הגדר חמישה כפתורים: הוסף הוצאה, ערוך הוצאה, מחק הוצאות, חיסכון בהוצאות, ו הצג תרשים הוצאות. הגדר את רכיב האב של כל אחד מהם, את הטקסט שהוא אמור להציג ואת הפקודה שהוא יפעיל כשתלחץ עליו. צור מסגרת עבור תיבת הרשימה. הגדר את רכיב האב, סגנון הגופן והרוחב.
צור פס גלילה אנכי והנח אותו בצד ימין של המסגרת. השתמש בו כדי לגלול בין התוכן של תיבת הרשימה. ארגן את כל האלמנטים עם ריפוד והתקשרות הדרושים 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()
הגדר את הפונקציונליות של מעקב ההוצאות
הגדירו שיטה, הוסף_הוצאות. אחזר את ערך ההוצאה, הפריט, הקטגוריה והתאריך. אם ערך ההוצאה והתאריך תקפים, הוסף את ההוצאה ל- הוצאות רשימה. הכנס רשומה זו לתיבת הרשימה ועצב אותה כראוי. לאחר ההוספה, מחק את קלט המשתמש בתיבות ההזנה עבור קלט חדש.
אחרת, הצג אזהרה שהערכים של הוצאה ותאריך אינם יכולים להיות ריקים. שִׂיחָה 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()
הגדירו שיטה, הוצאות_עריכה. אחזר את האינדקס של הרשומה שנבחרה וקבל את ההוצאה. פתח תיבת דו-שיח בבקשה להזין את ההוצאה. אם המשתמש סיפק הוצאה חדשה, שנה את רשימת ההוצאות בהתאם. תתקשר ל רשימת רענון ו 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()
הגדירו שיטה, מחק_הוצאות. אחזר את האינדקס של הרשומה שנבחרה וקבל את ההוצאה. העבר את האינדקס של הערך שברצונך למחוק. מחק את הערך הזה מתיבת הרשימה והתקשר אל 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()
הגדירו שיטה, רשימת רענון. מחק את הרשומה הקיימת והוסף במקום זאת רשומה חדשה עם הערכים המעודכנים.
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. הגדירו מילון, סיכומי_קטגוריה. חזרו דרך ה הוצאות לרשום ולהמיר את סכום ההוצאה לצוף. אחסן את סכום ההוצאה הכולל עבור כל קטגוריה. אם הקטגוריה כבר קיימת במילון, הגדל את הסכום בסכום ההוצאה הנוכחית. אחרת, צור רישום חדש עם סכום ההוצאה הנוכחית.
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
חלץ את הקטגוריות ואת ההוצאות לשתי רשימות שונות. צור דמות חדשה עבור העלילה בגודל שצוין. צור תרשים עוגה, תוך שימוש ברשימת ההוצאות בתור הנתונים וברשימת הקטגוריות בתור התווית. ה נתיחה אוטומטית פרמטר מציין את הפורמט להצגת ערכי האחוזים בפרוסות התרשים. לַעֲבוֹר שווה ל plt.axis כדי לוודא שאתה מצייר את תרשים העוגה כעיגול. הגדר את הכותרת של תרשים העוגה והצג אותו.
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() הפונקציה אומרת לפייתון להפעיל את לולאת האירועים של Tkinter ולהקשיב לאירועים עד שתסגור את החלון.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
בדוק תכונות שונות של Python Expense Tracker
כאשר אתה מפעיל את התוכנית, היא תפעיל חלון יישום. זה כולל שדות קלט כדי לרשום את ההוצאה, תיאור הפריט, הקטגוריה והתאריך. הזן כמה נתונים ולחץ על הוסף הוצאה לַחְצָן; תראה שהרשומה מתווספת לתיבת הרשימה. התוכנית גם מעדכנת את סך ההוצאות.
בחר רשומה ולחץ על ערוך הוצאות לַחְצָן. תופיע תיבת דו-שיח המאפשרת לך לעדכן את הרשומה האישית.
לחיצה על מחק הוצאות לחצן כדי להסיר את הרשומה שנבחרה.
על פגיעה ב הצג תרשים הוצאות כפתור, התוכנית מציגה תרשים עוגה. תרשים העוגה מציג את ההוצאה עבור כל קטגוריה יחד עם השם והאחוז שלה.
שיפור מעקב ההוצאות
אתה יכול להוסיף פונקציונליות חיפוש כדי לאפשר למשתמשים למצוא הוצאות ספציפיות על סמך התיאור, הסכום, הקטגוריה או התאריך שלהם. ניתן להוסיף אפשרות למיין ולסנן רשומות. התאם את האפליקציה כדי לתמוך בשפות ובפורמטים שונים של מטבעות.
אתה יכול גם להרחיב את האפליקציה עם תמיכה בהתראות. אפשר למשתמש להגדיר התראות כדי למנוע ממנו לחרוג ממגבלות התקציב או להדגיש הוצאה חריגה.