Скрипт за проследяване на разходи
![Скрипт за проследяване на разходи](https://urocibg.eu/wp-content/uploads/2024/07/Screenshot_1.png)
Този Python скрипт е създаден, за да ви помогне да следите вашите разходи. Той предоставя лесен за използване интерфейс, който ви позволява да въвеждате информация за вашите покупки, като дата, категория и сума. Скриптът съхранява тази информация във файл и ви позволява да преглеждате всички записани разходи, заедно с общата сума, която сте изхарчили.
Необходими компоненти
Софтуерни изисквания
- Python (версия 3.6 или по-нова)
- Библиотеката Tkinter (вградена в стандартната библиотека на Python)
Допълнителни файлове
expenses.txt
– текстов файл, в който ще се съхраняват разходите. Този файл се създава автоматично, ако не съществува.
Как да стартирате скрипта
- Инсталирайте Python: Ако нямате инсталиран Python, можете да го изтеглите от официалния сайт на Python.
- Запазете кода в Python файл:
import os
import tkinter as tk
from tkinter import ttk
from datetime import datetime
def add_expense():
date = date_entry.get()
category = category_entry.get()
amount = amount_entry.get()
if date and category and amount:
try:
datetime.strptime(date, "%d-%m-%Y")
with open("expenses.txt", "a") as file:
file.write(f"{date},{category},{amount}\n")
set_status("Разходът е добавен успешно!", "green")
date_entry.delete(0, tk.END)
category_entry.delete(0, tk.END)
amount_entry.delete(0, tk.END)
date_entry.insert(0, datetime.now().strftime("%d-%m-%Y"))
view_expenses()
except ValueError:
set_status("Невалиден формат на датата! Използвайте ДД-ММ-ГГГГ.", "red")
else:
set_status("Моля, попълнете всички полета!", "red")
def delete_expense():
selected_item = expenses_tree.selection()
if selected_item:
item_text = expenses_tree.item(selected_item, "values")
date, category, amount = item_text
with open("expenses.txt", "r") as file:
lines = file.readlines()
with open("expenses.txt", "w") as file:
for line in lines:
if line.strip() != f"{date},{category},{amount}":
file.write(line)
set_status("Разходът е изтрит успешно!", "green")
view_expenses()
else:
set_status("Моля, изберете разход за изтриване!", "red")
def view_expenses():
if os.path.exists("expenses.txt"):
total_expense = 0
expenses_tree.delete(*expenses_tree.get_children())
with open("expenses.txt", "r") as file:
for line in file:
date, category, amount = line.strip().split(",")
expenses_tree.insert("", tk.END, values=(date, category, amount))
total_expense += float(amount)
total_sum_label.config(text=f"Общ разход: {total_expense:.2f}")
else:
total_sum_label.config(text="Няма записани разходи.")
expenses_tree.delete(*expenses_tree.get_children())
def set_status(message, color):
status_label.config(text=message)
status_label_style.configure("Status.TLabel", foreground=color)
root = tk.Tk()
root.title("Проследяване на разходи")
root.geometry("615x570")
style = ttk.Style()
style.theme_use("clam")
style.configure("TLabel", background="#f0f0f0", font=("Arial", 12))
style.configure("TButton", background="#4CAF50", foreground="white", font=("Arial", 12, "bold"))
style.configure("TEntry", font=("Arial", 12))
style.configure("Treeview.Heading", font=("Arial", 12, "bold"), anchor="center")
style.configure("Treeview", font=("Arial", 12), rowheight=25)
style.configure("Treeview.Cell", anchor="center")
status_label_style = ttk.Style()
status_label_style.configure("Status.TLabel", font=("Arial", 12))
date_label = ttk.Label(root, text="Дата (ДД-ММ-ГГГГ):", anchor="center")
date_label.grid(row=0, column=0, padx=5, pady=5, sticky="EW")
date_entry = tk.Entry(root, justify="center", font=("Arial", 12))
date_entry.grid(row=0, column=1, padx=5, pady=5, sticky="EW")
date_entry.insert(0, datetime.now().strftime("%d-%m-%Y"))
category_label = ttk.Label(root, text="Категория:", anchor="center")
category_label.grid(row=1, column=0, padx=5, pady=5, sticky="EW")
category_entry = tk.Entry(root, justify="center", font=("Arial", 12))
category_entry.grid(row=1, column=1, padx=5, pady=5, sticky="EW")
amount_label = ttk.Label(root, text="Сума:", anchor="center")
amount_label.grid(row=2, column=0, padx=5, pady=5, sticky="EW")
amount_entry = tk.Entry(root, justify="center", font=("Arial", 12))
amount_entry.grid(row=2, column=1, padx=5, pady=5, sticky="EW")
add_button = ttk.Button(root, text="Добави разход", command=add_expense)
add_button.grid(row=3, column=0, columnspan=2, padx=5, pady=10, sticky="EW")
columns = ("Дата", "Категория", "Сума")
expenses_tree = ttk.Treeview(root, columns=columns, show="headings")
expenses_tree.heading("Дата", text="Дата")
expenses_tree.heading("Категория", text="Категория")
expenses_tree.heading("Сума", text="Сума")
expenses_tree.column("Дата", anchor="center")
expenses_tree.column("Категория", anchor="center")
expenses_tree.column("Сума", anchor="center")
expenses_tree.grid(row=4, column=0, columnspan=3, padx=5, pady=5, sticky="EW")
total_sum_label = ttk.Label(root, text="", anchor="center")
total_sum_label.grid(row=5, column=0, columnspan=2, padx=5, pady=5, sticky="EW")
status_label = ttk.Label(root, text="", style="Status.TLabel", anchor="center")
status_label.grid(row=6, column=0, columnspan=2, padx=5, pady=5, sticky="EW")
view_button = ttk.Button(root, text="Виж разходи", command=view_expenses)
view_button.grid(row=7, column=0, padx=5, pady=10, sticky="EW")
delete_button = ttk.Button(root, text="Изтрий разход", command=delete_expense)
delete_button.grid(row=7, column=1, padx=5, pady=10, sticky="EW")
if not os.path.exists("expenses.txt"):
with open("expenses.txt", "w"):
pass
view_expenses()
root.mainloop()
3. Стартирайте скрипта: Отворете команден ред или терминал и навигирайте до директорията, където сте запазили файла. Стартирайте скрипта с командата:
python expense_tracker.py
Описание на функционалностите
Графичен интерфейс
Графичният интерфейс е изграден с помощта на Tkinter. Той включва полета за въвеждане на дата, категория и сума, както и бутони за добавяне, преглед и изтриване на разходи.
Полета за въвеждане
- Дата (ДД-ММ-ГГГГ): Поле за въвеждане на дата във формат
ДД-ММ-ГГГГ
. - Категория: Поле за въвеждане на категорията на разхода.
- Сума: Поле за въвеждане на сумата на разхода.
Бутони
- Добави разход: Добавя нов разход към
expenses.txt
. - Виж разходи: Зарежда и показва всички записани разходи.
- Изтрий разход: Изтрива избрания разход от списъка.
Таблица с разходи
Таблица, в която се показват всички записани разходи. Съдържа колони за дата, категория и сума.
Детайлно обяснение на функциите
add_expense()
Функцията add_expense
се изпълнява при натискане на бутона „Добави разход“. Тя събира данните от полетата за въвеждане и ги добавя към файла expenses.txt
, ако въведените данни са валидни. След добавянето на разхода, полетата за въвеждане се изчистват и се обновява списъкът с разходи.
delete_expense()
Функцията delete_expense
се изпълнява при натискане на бутона „Изтрий разход“. Тя изтрива избрания ред от файла expenses.txt
и обновява списъка с разходи.
view_expenses()
Функцията view_expenses
зарежда всички разходи от файла expenses.txt
и ги показва в таблицата. Тя също така изчислява и показва общата сума на разходите.
set_status()
Функцията set_status
показва съобщения за статуса на операциите (успех или грешка) и променя цвета на текста в зависимост от типа на съобщението.
Поставяне и организация на скрипта
Структура на кода
Скриптът започва с необходимите импорти на модули и дефиниция на функции. След това се създава и конфигурира графичния интерфейс. Накрая, се стартира главният цикъл на приложението.
Файлова структура
expense_tracker.py
– Основният скрипт.expenses.txt
– Файл за съхранение на разходите.
Конфигуриране на стила
Скриптът използва стилове за персонализиране на външния вид на графичния интерфейс. Те са дефинирани с помощта на метода style.configure
.
Заключение
С този скрипт можете лесно да проследявате вашите разходи, като ги въвеждате, преглеждате и изтривате. Това е удобен начин за организиране на личните финанси и може да бъде разширен според вашите нужди.
Следвайте инструкциите по-горе за инсталация и стартиране, за да започнете да използвате скрипта. Убедете се, че всички необходими компоненти са налични и коректно конфигурирани.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut