Направите ову једноставну апликацију да бисте вежбали своје математичко програмирање и успут научили нешто о ГУИ кодирању.

Праћење трошкова је суштинско средство које помаже појединцима и предузећима да управљају својим финансијским трансакцијама. Помоћу уређаја за праћење трошкова можете креирати буџете, категоризовати трошкове и анализирати обрасце потрошње.

Сазнајте како да направите апликацију за праћење трошкова, са вишеплатформским ГУИ, у Питхон-у.

Модули Ткинтер, ЦСВ и Матплотлиб

Да бисте направили овај уређај за праћење трошкова, биће вам потребни модули Ткинтер, ЦСВ и Матплотлиб.

Ткинтер вам дозвољава креирајте десктоп апликације. Нуди разне виџете попут дугмади, налепница и оквира за текст који олакшавају развој апликација.

ЦСВ модул је уграђена Питхон библиотека која пружа функционалност за читање и писање ЦСВ (вредности раздвојене зарезима) датотеке.

Помоћу Матплотлиб-а можете да правите интерактивне визуелизације као што су графикони, дијаграми и графикони. Коришћење са модулима као што је ОпенЦВ може вам помоћи савладати технике побољшања слике такође.

instagram viewer

Да бисте инсталирали ове модуле, покрените:

pip install tk matplotlib 

Дефинишите структуру апликације за праћење трошкова

Изворни код овог пројекта можете пронаћи у његовом ГитХуб спремиште.

Започните увозом потребних модула. Дефинишите класу, ЕкпенсеТрацкерАпп. Подесите наслов и димензије. Дефинишите листу за чување трошкова и другу за категорије. Иницијализујте а СтрингВар назван категорија_вар и поставите његову почетну вредност на прву категорију на листи категорија. Завршите тако што ћете позвати цреате_видгетс методом.

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

Тхе цреате_видгетс метод је одговоран за додавање компоненти корисничког интерфејса вашој апликацији. Направите оквир за ознаке и уносе у евиденцији трошкова. Направите шест ознака: по једну за наслов, износ трошкова, опис ставке, категорију, датум и укупне трошкове. Подесите родитељски елемент сваког од њих, текст који треба да прикаже и стил фонта.

Направите три улазна виџета и а Цомбобок да бисте добили одговарајући улаз. За виџете за унос подесите родитељски елемент, стил фонта и ширину. Дефинишите родитељски елемент, листу вредности, стил фонта и ширину за Цомбобок. Бинд категорија_вар на њега, тако да се изабрана вредност аутоматски ажурира.

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)

Дефинишите пет дугмади: Адд Екпенсе, Уреди трошкове, Делете Екпенсе, Уштедите трошкове, и Прикажи графикон трошкова. Поставите родитељски елемент за сваки, текст који треба да прикаже и команду коју ће покренути када кликнете на њега. Направите оквир за оквир са листом. Подесите родитељски елемент, стил фонта и ширину.

Направите вертикалну траку за померање и поставите је на десну страну оквира. Користите га за скроловање кроз садржај оквира са листом. Организујте све елементе са потребним допунама и позовите упдате_тотал_лабел().

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

Дефинишите функционалност алата за праћење трошкова

Дефинишите метод, адд_екпенсе. Преузми вредност трошка, ставке, категорије и датума. Ако су вредност трошка и датум валидни, додајте трошак на трошкови листа. Уметните овај запис у оквир са листом и форматирајте га на одговарајући начин. Када се уметне, избришите кориснички унос у пољима за унос новог уноса.

У супротном, прикажите упозорење да вредности трошкова и датума не могу бити празни. Цалл упдате_тотал_лабел.

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

Дефинишите метод, едит_екпенсе. Преузми индекс изабраног записа и добиј трошак. Отворите дијалог у којем се тражи да унесете трошак. Ако је корисник навео нови трошак, у складу са тим измените листу трошкова. Звати освежи листу и упдате_тотал_лабел.

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

Дефинишите метод, делете_екпенсе. Преузми индекс изабраног записа и добиј трошак. Проследите индекс уноса који желите да избришете. Избришите тај унос са листе и позовите упдате_тотал_лабел.

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

Дефинишите метод, упдате_тотал_лабел. Израчунајте збир свих трошкова на листи и ажурирајте је на етикети. Дефинишите други метод, саве_екпенсес. Креирајте и отворите а ЦСВ датотека под називом трошкови.цсв у режиму писања. Додајте заглавља колона у ЦСВ датотеку као први ред. Итерирајте сваки запис о трошковима и запишите га као ред.

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

Дефинишите метод, схов_екпенсес_цхарт. Дефинишите речник, категорија_тоталс. Итерирајте кроз трошкови листа и претварање износа трошкова у флоат. Сачувајте укупан износ трошкова за сваку категорију. Ако категорија већ постоји у речнику, повећајте укупан износ за износ текућег трошка. У супротном, креирајте нови унос са тренутним износом трошкова.

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

Издвојите категорије и трошкове у две различите листе. Направите нову фигуру за парцелу са наведеном величином. Направите кружни графикон, користећи листу трошкова као податке и листу категорија као ознаку. Тхе аутопцт параметар одређује формат за приказивање процентуалних вредности на деловима графикона. Пасс једнаки до плт.акис да бисте били сигурни да ћете нацртати тортни графикон као круг. Поставите наслов тортног графикона и прикажите га.

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

Креирајте инстанцу ЕкпенсеТрацкерАпп класа. Тхе маинлооп() функција каже Питхон-у да покрене Ткинтер петљу догађаја и ослушкује догађаје док не затворите прозор.

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

Тестирајте различите карактеристике Питхон Екпенсе Трацкер-а

Када покренете програм, он ће покренути прозор апликације. Ово има поља за унос за бележење трошкова, описа ставке, категорије и датума. Унесите неке податке и кликните на Адд Екпенсе дугме; видећете да се запис додаје у оквир са листом. Програм такође ажурира укупне трошкове.

Изаберите запис и кликните на Уреди трошкове дугме. Појављује се оквир за дијалог који вам омогућава да ажурирате појединачни запис.

Кликом на Избриши трошкове дугме за уклањање изабраног записа.

На удару у Прикажи графикон трошкова дугме, програм приказује кружни графикон. Тортни графикон приказује трошкове за сваку категорију заједно са њеним називом и процентом.

Побољшање алата за праћење трошкова

Можете додати функцију претраживања како бисте омогућили корисницима да пронађу одређене трошкове на основу њиховог описа, износа, категорије или датума. Можете додати опцију за сортирање и филтрирање записа. Локализирајте апликацију да подржава различите језике и формате валута.

Такође можете проширити апликацију уз подршку за обавештења. Дозволите кориснику да подеси упозорења како би их спречио да прекораче ограничења буџета или да истакне било какву неуобичајену потрошњу.