أنشئ هذا التطبيق البسيط لممارسة برمجة الرياضيات وتعلم القليل عن ترميز واجهة المستخدم الرسومية على طول الطريق.
يعد تعقب النفقات أداة أساسية تساعد الأفراد والشركات على إدارة معاملاتهم المالية. باستخدام أداة تعقب النفقات، يمكنك إنشاء الميزانيات وتصنيف النفقات وتحليل أنماط الإنفاق.
تعرف على كيفية إنشاء تطبيق لتتبع النفقات، باستخدام واجهة المستخدم الرسومية عبر الأنظمة الأساسية، في Python.
وحدات Tkinter وCSV وMatplotlib
لإنشاء أداة تعقب النفقات هذه، ستحتاج إلى وحدات Tkinter وCSV وMatplotlib.
يتيح لك Tkinter إنشاء تطبيقات سطح المكتب. فهو يقدم مجموعة متنوعة من الأدوات مثل الأزرار والعلامات ومربعات النص التي تسهل تطوير التطبيقات.
وحدة CSV هي مكتبة Python مدمجة توفر وظائف للقراءة والكتابة ملفات CSV (القيم المفصولة بفواصل)..
باستخدام Matplotlib، يمكنك إنشاء تصورات تفاعلية مثل الرسوم البيانية والمؤامرات والمخططات. يمكن أن يساعدك استخدامه مع وحدات مثل OpenCV تقنيات تحسين الصورة الرئيسية أيضاً.
لتثبيت هذه الوحدات، قم بتشغيل:
pip install tk matplotlib
تحديد هيكل تطبيق تعقب النفقات
يمكنك العثور على الكود المصدري لهذا المشروع في ملف مستودع جيثب.
ابدأ باستيراد الوحدات الضرورية. تحديد فئة، ExpenseTrackerApp. قم بتعيين العنوان والأبعاد. تحديد قائمة لتخزين النفقات وأخرى للفئات. تهيئة أ StringVar اسم الشيئ class_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 الطريقة مسؤولة عن إضافة مكونات واجهة المستخدم إلى تطبيقك. قم بإنشاء إطار لتسميات وإدخالات سجل النفقات. قم بإنشاء ستة تسميات: واحدة لكل من العنوان ومبلغ المصروفات ووصف العنصر والفئة والتاريخ وإجمالي المصروفات. قم بتعيين العنصر الأصلي لكل عنصر، والنص الذي يجب أن يعرضه، ونمط الخط الخاص به.
قم بإنشاء ثلاث عناصر واجهة مستخدم و صندوق التحرير للحصول على المدخلات المقابلة. بالنسبة لعناصر واجهة مستخدم الإدخال، قم بتعيين العنصر الأصلي ونمط الخط والعرض. حدد العنصر الأصلي وقائمة القيم ونمط الخط وعرض الملف صندوق التحرير. ربط class_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()
تحديد وظيفة تعقب النفقات
تحديد الطريقة، 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()
تحديد الطريقة، تحرير_المصاريف. قم باسترجاع فهرس السجل المحدد واحصل على المصاريف. افتح مربع حوار يطلب إدخال المصاريف. إذا قدم المستخدم حسابًا جديدًا، فقم بتغيير قائمة النفقات وفقًا لذلك. اتصل ب تحديث القائمة و 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()
تحديد الطريقة، تحديث القائمة. احذف السجل الموجود وأضف سجلاً جديدًا بالقيم المحدثة بدلاً من ذلك.
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. احسب مجموع جميع النفقات في القائمة وقم بتحديثه على الملصق. تعريف طريقة أخرى save_expenses. إنشاء وفتح أ 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. تعريف القاموس، class_totals. التكرار من خلال نفقات قائمة وتحويل مبلغ المصاريف إلى تعويم. قم بتخزين إجمالي مبلغ النفقات لكل فئة. إذا كانت الفئة موجودة بالفعل في القاموس، فقم بزيادة الإجمالي بمقدار مبلغ المصروفات الحالي. بخلاف ذلك، قم بإنشاء إدخال جديد بمبلغ المصروفات الحالي.
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
استخرج الفئات والنفقات إلى قائمتين مختلفتين. قم بإنشاء شخصية جديدة للمخطط بالحجم المحدد. قم بإنشاء مخطط دائري، باستخدام قائمة النفقات كبيانات وقائمة الفئات كتسمية. ال com.autopct تحدد المعلمة تنسيق عرض قيم النسبة المئوية على شرائح المخطط. يمر متساوي ل 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 فصل. ال الحلقة الرئيسية () تخبر الوظيفة Python بتشغيل حلقة حدث Tkinter والاستماع إلى الأحداث حتى تغلق النافذة.
if __name__ == "__main__":
app = ExpenseTrackerApp()
app.mainloop()
اختبر الميزات المختلفة لبرنامج Python Expense Tracker
عند تشغيل البرنامج، سيتم تشغيل نافذة التطبيق. يحتوي هذا على حقول إدخال لتسجيل المصاريف ووصف العنصر والفئة والتاريخ. أدخل بعض البيانات ثم اضغط على أضف النفقات زر؛ سترى تتم إضافة السجل إلى مربع القائمة. يقوم البرنامج أيضًا بتحديث إجمالي النفقات.
حدد سجلاً وانقر فوق تحرير النفقات زر. يظهر مربع حوار، مما يتيح لك تحديث السجل الفردي.
النقر على حذف النفقات زر لإزالة السجل المحدد.
على ضرب إظهار مخطط النفقات الزر، يعرض البرنامج مخططًا دائريًا. يعرض المخطط الدائري المصاريف لكل فئة بالإضافة إلى اسمها ونسبتها المئوية.
تحسين تعقب النفقات
يمكنك إضافة وظيفة بحث للسماح للمستخدمين بالعثور على نفقات محددة بناءً على الوصف أو المبلغ أو الفئة أو التاريخ. يمكنك إضافة خيار لفرز وتصفية السجلات. قم بترجمة التطبيق لدعم اللغات وتنسيقات العملات المختلفة.
يمكنك أيضًا توسيع التطبيق بدعم الإشعارات. اسمح للمستخدم بإعداد التنبيهات لمنعه من تجاوز حدود الميزانية أو تسليط الضوء على أي إنفاق غير عادي.