Создайте это простое приложение, чтобы попрактиковаться в математическом программировании и попутно узнать немного о кодировании графического интерфейса.

Трекер расходов — это важный инструмент, который помогает частным лицам и предприятиям управлять своими финансовыми транзакциями. С помощью трекера расходов вы можете создавать бюджеты, классифицировать расходы и анализировать структуру расходов.

Узнайте, как создать приложение для отслеживания расходов с кроссплатформенным графическим интерфейсом на Python.

Модули Tkinter, CSV и Matplotlib

Чтобы создать этот трекер расходов, вам понадобятся модули Tkinter, CSV и Matplotlib.

Ткинтер позволяет вам создавать настольные приложения. Он предлагает множество виджетов, таких как кнопки, метки и текстовые поля, которые упрощают разработку приложений.

Модуль CSV — это встроенная библиотека Python, предоставляющая функции чтения и записи. CSV-файлы (значения, разделенные запятыми).

С помощью Matplotlib вы можете создавать интерактивные визуализации, такие как графики, графики и диаграммы. Использование его с такими модулями, как OpenCV, может помочь вам.

instagram viewer
освоить методы улучшения изображений слишком.

Чтобы установить эти модули, запустите:

pip install tk matplotlib 

Определите структуру приложения для отслеживания расходов

Вы можете найти исходный код этого проекта в его Репозиторий GitHub.

Начните с импорта необходимых модулей. Определить класс, Приложение ExpenseTracker. Установите заголовок и размеры. Определите список для хранения расходов и список для категорий. Инициализировать Стрингвар названный категория_вар и установите его начальное значение для первой категории в списке категорий. Завершите процедуру, позвонив 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 Метод отвечает за добавление компонентов пользовательского интерфейса в ваше приложение. Создайте рамку для меток и записей записи расходов. Создайте шесть ярлыков: по одному для заголовка, суммы расходов, описания элемента, категории, даты и общей суммы расходов. Установите родительский элемент каждого из них, текст, который он должен отображать, и стиль шрифта.

Создайте три виджета входа и Поле со списком чтобы получить соответствующий ввод. Для виджетов входа установите родительский элемент, стиль шрифта и ширину. Определите родительский элемент, список значений, стиль шрифта и ширину Поле со списком. Связывать категория_вар к нему, поэтому выбранное значение автоматически обновляется.

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

Определить метод, edit_expense. Получите индекс выбранной записи и получите расходы. Откройте диалоговое окно с просьбой ввести расход. Если пользователь предоставил новые расходы, измените список расходов соответствующим образом. Позвоните в обновить список и 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. Определить словарь, категория_итого. Перебрать затраты перечислите и преобразуйте сумму расходов в плавающую. Сохраните общую сумму расходов для каждой категории. Если категория уже существует в словаре, увеличьте общую сумму на текущую сумму расходов. В противном случае создайте новую запись с текущей суммой расходов.

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

Создайте экземпляр Приложение ExpenseTracker сорт. основной цикл() Функция сообщает Python запустить цикл событий Tkinter и прослушивать события, пока вы не закроете окно.

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

Тестируйте различные функции Python Expense Tracker

Когда вы запустите программу, она запустит окно приложения. Здесь есть поля ввода для записи расходов, описания товара, категории и даты. Введите некоторые данные и нажмите кнопку Добавить расходы кнопка; вы увидите, что запись добавляется в список. Программа также обновляет общие расходы.

Выберите запись и нажмите кнопку Редактировать расходы кнопка. Появится диалоговое окно, позволяющее обновить отдельную запись.

Нажав на Удалить расходы Кнопка для удаления выбранной записи.

При попадании в Показать график расходов Кнопка, программа отображает круговую диаграмму. На круговой диаграмме отображаются расходы для каждой категории вместе с ее названием и процентом.

Улучшение отслеживания расходов

Вы можете добавить функцию поиска, чтобы пользователи могли находить конкретные расходы по их описанию, сумме, категории или дате. Вы можете добавить возможность сортировки и фильтрации записей. Локализуйте приложение для поддержки разных языков и форматов валют.

Вы также можете расширить приложение, добавив поддержку уведомлений. Позвольте пользователю настраивать оповещения, чтобы он не мог превысить бюджетные ограничения или выделять любые необычные расходы.