Contents

如何使用 Python 構建費用跟踪器

費用跟踪器是幫助個人和企業管理財務交易的重要工具。通過費用跟踪器,您可以創建預算、對費用進行分類並分析支出模式。

探索使用 Python 編程語言構建跨平台圖形用戶界面 (GUI) 應用程序來跟踪費用的方法。

Tkinter、CSV 和 Matplotlib 模塊

為了構建這個費用跟踪應用程序,有必要利用 Tkinter、CSV 和 Matplotlib 庫。

Tkinter 通過提供一系列多功能圖形組件(例如按鈕、標籤和文本輸入字段),使開發人員能夠製作迷人的桌面應用程序。其用戶友好的界面簡化了為各種目的創建應用程序的過程。

CSV 模塊是一個固有的Python 包,提供與逗號分隔值(CSV) 文件的解釋和組合相關的功能,由於其簡單性和與各種平台的兼容性,這些文件被廣泛用於在不同應用程序和系統之間交換數據。

Matplotlib 是一個強大的工具,用於創建動態視覺表示,包括圖形、繪圖和圖表,可以通過將其與 OpenCV 結合來進一步增強,以獲得高級圖像處理技術的專業知識。

要安裝這些模塊,請運行:

pip install tk matplotlib 

定義費用跟踪應用程序的結構

該項目源代碼的來源位於其指定的 GitHub 存儲庫中,該存儲庫充當所有相關文件和文檔的數字存儲庫。

首先,我們導入命令式模塊。然後,我們建立一個名為“ExpenseTrackerApp”的類,它列出了應用程序的標題和尺寸。接下來,我們定義一對有序列表;一個包含所有記錄的支出,另一個包含各種貨幣類別。還建立了一個名為“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 方法是在應用程序中構建用戶界面的重要組件。為了建立一個用於顯示與費用相關的信息的框架,我們必須生成由框架組成的視覺元素,這些框架容納與這些記錄相關的特定細節。具體來說,我們將開發六個獨立的標籤小部件;每個都旨在顯示相關數據,例如標題、貨幣價值、描述、類別、日期和總體總數。為每個標籤分配一個父元素,同時指定它們各自的文本和印刷特徵,這一點至關重要。

為了創建一個具有三個文本輸入和一個下拉菜單的界面,請在後者和名為“category_var”的變量之間建立連接。首先定義每個元素的佈局;指定它們各自的字體樣式和尺寸,如下所示:1。創建三個 Entry 小部件並為它們分配單獨的父容器、樣式選項和寬度約束。2.構造一個 Combobox 小部件,定義其父容器、可用選項列表、字體樣式和尺寸規格。3。將組合框與變量“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) 

創建一個包含以下組件的用戶界面:標有“添加費用”的按鈕,用於將費用添加到列表中;標有“編輯費用”的按鈕,用於編輯列表中的現有費用;標有“刪除費用”的按鈕,用於刪除列表中的費用;標有“保存費用”的按鈕,保存列表中的所有費用;標有“顯示費用圖表”的按鈕,顯示列表中的費用圖表;圍繞這些按鈕的框架,標題為“費用管理器” ”。

合併創建垂直滾動條的功能,該滾動條位於 GUI 主要內容區域的右側,允許在列錶框中的內容進行無縫導航。利用適當的填充技術,確保最佳的視覺呈現。此外,在使用新信息更新總標籤後,執行任何必要的調整以保持整個界面的一致性。

         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 的函數調用。

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

當然!下面是如何使用 Flask 和 SQLAlchemy 在 Python 中實現此功能的示例:pythonfromflask import gfrom sqlalchemy import create_engine, Column, Integer, String,foreignKeyfrom sqlalchemy.orm import sessionmaker, relationshipfrom datetime import datetimeclass User(db.Model): tablename=‘users’id=Column(‘id’, Integer, Primary_key=True)name=Column(’name’, String)email=Column(’email’, String)created_at=Column(‘created_at’, DateTime, default=datetime. utcnow)updated_at=Column(‘updated_at’, DateTime, onupdate=datetime.utcnow)

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

為了完善所提供的文本,我需要更多關於您希望我如何處理此代碼片段的上下文。然而,我嘗試讓給定的文本聽起來更複雜:pythondef update_total_label(expenses):total=sum(expenses)return Totaldef save_expenses(filename=“expenses.csv”,expenses=None):if notexpenses:expenses=[ ] # 打開指定的CSV 文件,如果不存在則創建一個try:with open(filename, “w”) as f:writer=csv.writer(f)# 寫入標題rowwriter.writerow([…])

     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”的字典,它將作為一個計數器來累計每個支出類別的總支出。我們將迭代“費用”列表中的條目,將每個費用金額從字符串轉換為浮點數。對於每個類別,如果它存在於 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 

要創建數據集中費用分類分佈的可視化表示,可以使用 matplotlib 的“pie”函數。此功能允許根據給定的費用金額及其相應類別生成餅圖。通過設置各種參數,例如autopctequal和圖表標題,用戶可以自定義最終輸出的顯示方式。

         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 費用跟踪器的不同功能

程序執行後,將啟動圖形用戶界面(GUI),除了用於輸入數值的文本框外,還具有用於記錄支出相關詳細信息(例如項目描述、類別和日期)的輸入字段。通過輸入此信息並單擊“添加費用”按鈕,可以預期一個新條目將附加到列錶框中。此外,為了您的方便,該程序會不斷更新所有記錄費用的總和。

/bc/images/adding-entries-to-expense-tracker.jpg

選擇特定費用條目後,請單擊“編輯費用”按鈕以啟動編輯過程。這將提示一個對話框,使您能夠在現有上下文中修改所選個人支出項目的詳細信息。

/bc/images/selecting-and-editing-expense.jpg

通過單擊“刪除費用”按鈕來刪除特定費用記錄,這會從費用列表中刪除所選項目。

/bc/images/selecting-and-deleting-expense.jpg

單擊“顯示費用圖表”按鈕後,軟件會生成餅圖形式的圖形表示,說明各個類別的支出分佈情況,並附有各自的名稱和百分比。

/bc/images/pie-chart-of-expenses.jpg

改進費用追踪器

為了增強用戶體驗,可以結合搜索功能,使個人能夠根據特定支出的描述、價值、分類或日期來定位特定支出。此外,您可以提供用於數據記錄排序和過濾的選項。調整應用程序以適應各種語言和貨幣樣式將是有益的。

考慮在應用程序中合併通知功能,允許用戶建立在違反時觸發警報的閾值。這些警報可以作為超支的警告,並幫助識別不正常的支出。