Pythonを使用して経費トラッカーを構築する方法

経費トラッカーは、個人や企業が財務取引を管理するのに役立つ不可欠なツールです。経費トラッカーを使用すると、予算を作成し、経費を分類し、支出パターンを分析できます。

PythonでクロスプラットフォームGUIを備えた経費トラッカーアプリを構築する方法を紹介します。

Tkinter、CSV、Matplotlibモジュール

この経費トラッカーを構築するには、Tkinter、CSV、Matplotlibモジュールが必要です。

Tkinterを使用すると、デスクトップアプリケーションを作成できます。ボタン、ラベル、テキストボックスなどのさまざまなウィジェットを提供しており、アプリを簡単に開発できます。

CSVモジュールは、CSV(カンマ区切り値)ファイルの読み取りと書き込みの機能を提供する組み込みのPythonライブラリです。

Matplotlibを使用すると、グラフ、プロット、チャートなどのインタラクティブな視覚化を構築できます。OpenCVなどのモジュールと組み合わせて使用すると、画像の補正手法も習得できます。

これらのモジュールをインストールするには、次を実行します。

pip install tk matplotlib

経費トラッカーアプリの構造を定義する

このプロジェクトのソースコードは、GitHubリポジトリにあります。

必要なモジュールをインポートすることから始めます。ExpenseTrackerAppというクラスを定義します。タイトルと寸法を設定します。経費を格納するためのリストと、カテゴリ用のリストを定義します。category_varという名前のStringVarを初期化し、その初期値をカテゴリリストの最初のカテゴリに設定します。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メソッドは、アプリにUIコンポーネントを追加する役割を果たします。経費記録のラベルとエントリ用のフレームを作成します。6つのラベルを作成します。1つはヘッディング用、1つは経費金額用、1つは品目説明用、1つはカテゴリ用、1つは日付用、1つは合計経費用です。それぞれに親要素、表示するテキスト、フォントスタイルを設定します。

対応する入力を取得するために、3つのエントリウィジェットと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)

経費の追加経費の編集経費の削除経費の保存経費チャートの表示という5つのボタンを定義します。それぞれに親要素、表示するテキスト、クリックしたときに実行するコマンドを設定します。リストボックス用のフレームを作成します。親要素、フォントスタイル、幅を設定します。

縦スクロールバーを作成して、フレームの右側に配置します。これを使用して、リストボックスの内容をスクロールします。必要なパディングですべての要素を整理し、update_total_label()を呼び出します。

self.add_button = tk.Button(self, text="経費の追加", 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="経費の編集", command=self.edit_expense
)
self.edit_button.pack(pady=5)
self.delete_button = tk.Button(
self, text="経費の削除", command=self.delete_expense
)
self.delete_button.pack(pady=5)
self.save_button = tk.Button(
self, text="経費の保存", command=self.save_expenses
)
self.save_button.pack(pady=5)
self.total_label = tk.Label(
self, text="合計経費:", font=("Helvetica", 12)
)
self.total_label.pack(pady=5)
self.show_chart_button = tk.Button(
self, text="経費チャートの表示", command=self.show_expenses_chart
)
self.show_chart_button.pack(pady=5)
self.update_total_label()

経費トラッカーの機能を定義する

add_expenseというメソッドを定義します。経費、品目、カテゴリ、日付の値を取得します。経費と日付の値が有効な場合、expensesリストに経費を追加します。このレコードをリストボックスに挿入して、適切に書式設定します。挿入したら、新しい入力のためにエントリボックスのユーザー入力を削除します。

それ以外の場合は、経費と日付の値が空であることを示す警告を表示します。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("警告", "経費と日付は空にできません。")
self.update_total_label()

edit_expenseというメソッドを定義します。選択したレコードのインデックスを取得して、経費を取得します。経費を入力するように求めるダイアログボックスを開きます。ユーザーが新しい経費を提供した場合、それに応じて経費リストを変更します。refresh_listupdate_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(
"経費の編集", "新しい経費を入力してください:", 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という別のメソッドを定義します。expenses.csvという名前のCSVファイルを作成して書き込みモードで開きます。1行目にCSVファイルに列ヘッダーを追加します。各経費レコードを反復処理し、行として書き込みます。

def update_total_label(self):
total_expenses = sum(float(expense[0]) for expense in self.expenses)
self.total_label.config(text=f"合計経費: USD {total_expenses:.2f}")
def save_expenses(self):
with open("expenses.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile)
column_headers = ["経費金額", "品目説明", "カテゴリ", "日付"]
writer.writerow(column_headers)
for expense in self.expenses:
writer.writerow(expense))

show_expenses_chartというメソッドを定義します。ディクショナリcategory_totalsを定義します。expensesリストを反復処理して、経費金額をfloatに変換します。各カテゴリの合計経費金額を格納します。カテゴリが辞書にすでに存在する場合は、合計に現在の経費金額を加算します。それ以外の場合は、現在の経費金額で新しいエントリを作成します。

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

カテゴリと経費を2つの異なるリストに抽出します。指定されたサイズのプロットの新しい図を作成します。経費リストをデータとして、カテゴリリストをラベルとして使用して円グラフを生成します。autopctパラメータは、チャートのスライスにパーセンテージ値を表示するための形式を指定します。円グラフを円として描画するには、equalplt.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"経費カテゴリの分布 (USD)")
plt.show()

ExpenseTrackerAppクラスのインスタンスを作成します。mainloop()関数は、PythonにTkinterイベントループを実行し、ウィンドウを閉じるまでイベントをリッスンするように指示します。

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

Python経費トラッカーのさまざまな機能をテストする

プログラムを実行すると、アプリケーションウィンドウが起動します。これには、経費、品目説明、カテゴリ、日付を記録するための入力フィールドがあります。いくつかのデータを入力して経費の追加ボタンをクリックすると、レコードがリストボックスに追加されます。プログラムは合計経費も更新します。

レコードを選択して経費の編集ボタンをクリックします。ダイアログボックスが表示され、個々のレコードを更新できます。

経費の削除ボタンをクリックして、選択したレコードを削除します。

経費チャートの表示ボタンをクリックすると、プログラムは円グラフを表示します。円グラフは、各カテゴリの経費とその名前とパーセンテージを表示します。

経費トラッカーの改善

検索機能を追加して、ユーザーが説明、金額、カテゴリ、日付に基づいて特定の経費を見つけることができるようにします。レコードの並べ替えとフィルタリングのオプションを追加できます。さまざまな言語と通貨形式をサポートするようにアプリをローカライズします。

通知をサポートするようにアプリを拡張することもできます。ユーザーが予算の上限を超えないようにアラートを設定したり、異常な支出を強調表示したりできるようにします。