Скрипт за проследяване на разходи

Скрипт за проследяване на разходи

Този Python скрипт е създаден, за да ви помогне да следите вашите разходи. Той предоставя лесен за използване интерфейс, който ви позволява да въвеждате информация за вашите покупки, като дата, категория и сума. Скриптът съхранява тази информация във файл и ви позволява да преглеждате всички записани разходи, заедно с общата сума, която сте изхарчили.

Необходими компоненти

Софтуерни изисквания

  • Python (версия 3.6 или по-нова)
  • Библиотеката Tkinter (вградена в стандартната библиотека на Python)

Допълнителни файлове

  • expenses.txt – текстов файл, в който ще се съхраняват разходите. Този файл се създава автоматично, ако не съществува.

Как да стартирате скрипта

  1. Инсталирайте Python: Ако нямате инсталиран Python, можете да го изтеглите от официалния сайт на Python.
  2. Запазете кода в 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.

Заключение

С този скрипт можете лесно да проследявате вашите разходи, като ги въвеждате, преглеждате и изтривате. Това е удобен начин за организиране на личните финанси и може да бъде разширен според вашите нужди.

Следвайте инструкциите по-горе за инсталация и стартиране, за да започнете да използвате скрипта. Убедете се, че всички необходими компоненти са налични и коректно конфигурирани.

Fedya Serafiev

Федя Серафиев

Федя Серафиев е собственик на сайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: