خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه با استفاده از پایتون یک ردیاب هزینه بسازیم

این برنامه ساده را بسازید تا برنامه نویسی ریاضی خود را تمرین کنید و در طول مسیر کمی در مورد کدنویسی GUI بیاموزید.

ردیاب هزینه ابزاری ضروری است که به افراد و مشاغل کمک می کند تا تراکنش های مالی خود را مدیریت کنند. با یک ردیاب هزینه، می توانید بودجه ایجاد کنید، هزینه ها را دسته بندی کنید و الگوهای هزینه را تجزیه و تحلیل کنید.

نحوه ایجاد یک برنامه ردیاب هزینه، با رابط کاربری گرافیکی بین پلتفرمی، در پایتون را بیاموزید.

ماژول های Tkinter، CSV و Matplotlib

برای ساخت این ردیاب هزینه، به ماژول های Tkinter، CSV و Matplotlib نیاز دارید.

Tkinter به شما امکان می دهد برنامه های دسکتاپ ایجاد کنید. ویجت‌های مختلفی مانند دکمه‌ها، برچسب‌ها و جعبه‌های متنی را ارائه می‌دهد که توسعه برنامه‌ها را آسان می‌کند.

ماژول CSV یک کتابخانه داخلی پایتون است که قابلیت خواندن و نوشتن فایل های CSV (مقادیر جدا شده با کاما) را فراهم می کند.

با Matplotlib می‌توانید تجسم‌های تعاملی مانند نمودارها، نمودارها و نمودارها را بسازید. استفاده از آن با ماژول هایی مانند OpenCV می تواند به شما در تسلط بر تکنیک های بهبود تصویر نیز کمک کند.

برای نصب این ماژول ها، اجرا کنید:

pip install tk matplotlib

ساختار اپلیکیشن Expense Tracker را تعریف کنید

شما می توانید کد منبع این پروژه را در مخزن GitHub آن پیدا کنید.

با وارد کردن ماژول های لازم شروع کنید. یک کلاس تعریف کنید، ExpenseTrackerApp. عنوان و ابعاد را تنظیم کنید. یک لیست برای ذخیره هزینه ها و لیستی دیگر برای دسته ها تعریف کنید. یک StringVar با نام category_var را راه‌اندازی کنید و مقدار اولیه آن را روی دسته اول در لیست دسته‌ها قرار دهید. با فراخوانی متد create_widgets کار را تمام کنید.

import tkinter as tk
from tkinter import ttk, messagebox, simpledialog
import csv
import matplotlib.pyplot as plt

class ExpenseTrackerApp(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 را به آن متصل کنید، بنابراین مقدار انتخاب شده به طور خودکار به روز می شود.

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

پنج دکمه را تعریف کنید: Add Expense، Edit Expense، Delete Expense، Save Expenses و Show Expense Chart. عنصر والد هر کدام، متنی که باید نمایش داده شود و فرمانی که با کلیک روی آن اجرا می شود را تنظیم کنید. یک قاب برای لیست باکس ایجاد کنید. عنصر والد، سبک فونت و عرض را تنظیم کنید.

مطلب مرتبط:   نحوه ایجاد یک سیستم دوربین برای بازی های دو بعدی در گودو

یک نوار اسکرول عمودی ایجاد کنید و آن را در سمت راست قاب قرار دهید. از آن برای پیمایش در محتویات فهرست باکس استفاده کنید. همه عناصر را با padding لازم سازماندهی کنید و 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 تماس بگیرید.

    def add_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 تماس بگیرید.

    def edit_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 را فراخوانی کنید.

    def delete_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. رکورد موجود را حذف کنید و به جای آن یک رکورد جدید با مقادیر به روز شده اضافه کنید.

    def refresh_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 به نام costs.csv در حالت نوشتن ایجاد و باز کنید. عنوان ستون را به عنوان ردیف اول به فایل CSV اضافه کنید. روی هر رکورد هزینه تکرار کنید و آن را به صورت یک ردیف بنویسید.

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

    def save_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. دیکشنری تعریف کنید، category_totals. لیست هزینه ها را تکرار کنید و مبلغ هزینه را به شناور تبدیل کنید. مقدار کل هزینه را برای هر دسته ذخیره کنید. اگر این دسته از قبل در فرهنگ لغت وجود دارد، کل را با مقدار هزینه جاری افزایش دهید. در غیر این صورت، یک ورودی جدید با مبلغ هزینه جاری ایجاد کنید.

    def show_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 فرمت نمایش مقادیر درصد را در برش های نمودار مشخص می کند. برای اطمینان از اینکه نمودار دایره ای را به صورت دایره ای رسم کرده اید برابر با 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()

ویژگی های مختلف ردیاب هزینه پایتون را آزمایش کنید

هنگامی که برنامه را اجرا می کنید، یک پنجره برنامه راه اندازی می شود. این دارای فیلدهای ورودی برای ثبت هزینه، شرح مورد، دسته و تاریخ است. مقداری داده را وارد کنید و روی دکمه Add Expense کلیک کنید. خواهید دید که رکورد به کادر لیست اضافه می شود. این برنامه همچنین کل هزینه ها را به روز می کند.

مطلب مرتبط:   این زبان برنامه نویسی اصلی به تازگی 60 ساله شده است: در اینجا دلیل اهمیت آن است

افزودن ورودی به ردیاب هزینه

یک رکورد را انتخاب کنید و روی دکمه Edit Expenses کلیک کنید. یک کادر محاوره ای ظاهر می شود که به شما امکان می دهد رکورد فردی را به روز کنید.

هزینه انتخاب و ویرایش

برای حذف رکورد انتخاب شده، روی دکمه Delete Expenses کلیک کنید.

انتخاب و حذف هزینه

با زدن دکمه Show Expenses Chart، برنامه یک نمودار دایره ای نمایش می دهد. نمودار دایره ای هزینه هر دسته را همراه با نام و درصد آن نشان می دهد.

نمودار دایره ای هزینه ها

بهبود ردیاب هزینه

می‌توانید قابلیت جستجو را اضافه کنید تا به کاربران اجازه دهید هزینه‌های خاصی را بر اساس توضیحات، مقدار، دسته‌بندی یا تاریخ پیدا کنند. می توانید گزینه ای برای مرتب سازی و فیلتر کردن رکوردها اضافه کنید. برنامه را برای پشتیبانی از زبان‌ها و فرمت‌های ارز مختلف محلی کنید.

همچنین می توانید برنامه را با پشتیبانی از اعلان ها گسترش دهید. به کاربر اجازه دهید هشدارهایی را تنظیم کند تا از تجاوز آنها به محدودیت های بودجه جلوگیری کند یا هرگونه هزینه غیرعادی را برجسته کند.