/
Boris388
/
git_test1
Обзор
Документация
Войти
/
Boris388
/
git_test1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
gui.py
98 строк
5 KB
Boris
added main, gui and test_models
08 янв 2026, 13:18
08 янв 2026, 13:18
05e7046
Код
Авторство
О чём код?
import tkinter as tk from tkinter import ttk, messagebox from models import Transaction, Category from storage import load_transactions, save_transactions from analysis import get_balance, plot_income_expense_timeline, plot_expense_pie, plot_top_expenses import re class FinancePlan: def __init__(self, root): self.root = root self.root.title("Финансовое планирование") self.transactions = load_transactions() self.setup_ui() def setup_ui(self): tk.Label(self.root, text="Сумма:").grid(row=0, column=0, padx=5, pady=5) self.amount_entry = tk.Entry(self.root) self.amount_entry.grid(row=0, column=1, padx=5, pady=5) tk.Label(self.root, text="Дата (ДД-ММ-ГГГГ):").grid(row=1, column=0, padx=5, pady=5) self.date_entry = tk.Entry(self.root) self.date_entry.grid(row=1, column=1, padx=5, pady=5) tk.Label(self.root, text="Категория:").grid(row=2, column=0, padx=5, pady=5) self.category_entry = tk.Entry(self.root) self.category_entry.grid(row=2, column=1, padx=5, pady=5) tk.Label(self.root, text="Комментарий:").grid(row=3, column=0, padx=5, pady=5) self.comment_entry = tk.Entry(self.root) self.comment_entry.grid(row=3, column=1, padx=5, pady=5) self.is_income_var = tk.BooleanVar(value=True) tk.Radiobutton(self.root, text="Доход", variable=self.is_income_var, value=True).grid(row=4, column=0) tk.Radiobutton(self.root, text="Расход", variable=self.is_income_var, value=False).grid(row=4, column=1) tk.Button(self.root, text="Добавить операцию", command=self.add_transaction).grid(row=5, column=0, columnspan=2, pady=10) self.tree = ttk.Treeview(self.root, columns=("Сумма", "Дата", "Категория", "Комментарий", "Тип"), show="headings", height=10) self.tree.heading("Сумма", text="Сумма") self.tree.heading("Дата", text="Дата") self.tree.heading("Категория", text="Категория") self.tree.heading("Комментарий", text="Комментарий") self.tree.heading("Тип", text="Тип") self.tree.grid(row=6, column=0, columnspan=2, padx=5, pady=5) tk.Button(self.root, text="Баланс", command=self.show_balance).grid(row=7, column=0, pady=5) tk.Button(self.root, text="График доходов/расходов", command=lambda: plot_income_expense_timeline(self.transactions)).grid(row=7, column=1, pady=5) tk.Button(self.root, text="Круговая диаграмма расходов", command=lambda: plot_expense_pie(self.transactions)).grid(row=8, column=0, pady=5) tk.Button(self.root, text="Топ-5 расходов", command=lambda: plot_top_expenses(self.transactions)).grid(row=8, column=1, pady=5) self.refresh_transaction_list() def add_transaction(self): try: amount = self.amount_entry.get() date = self.date_entry.get() category_name = self.category_entry.get() comment = self.comment_entry.get() is_income = self.is_income_var.get() if not re.match(r'^\d+(\.\d{1,2})?$', amount): messagebox.showerror("Ошибка", "Сумма должна быть положительным числом с не более 2 знаками после разделительной точки") return if not re.match(r'^\d{2}-\d{2}-\d{4}$', date): messagebox.showerror("Ошибка", "Дата должна быть в формате ДД-ММ-ГГГГ") return category = Category(category_name) tx = Transaction(float(amount), date, category, comment, is_income) self.transactions.append(tx) save_transactions(self.transactions) self.refresh_transaction_list() messagebox.showinfo("Успех", "Операция добавлена!") except ValueError as e: messagebox.showerror("Ошибка", str(e)) except Exception as e: messagebox.showerror("Ошибка", f"Неизвестная ошибка: {e}") def refresh_transaction_list(self): for item in self.tree.get_children(): self.tree.delete(item) for tx in self.transactions: self.tree.insert("", "end", values=( tx.amount, tx.date, tx.category.name, tx.comment, "Доход" if tx.is_income else "Расход" )) def show_balance(self): balance = get_balance(self.transactions) msg = (f"Доходы: {balance['income']}\n" f"Расходы: {balance['expense']}\n" f"Баланс: {balance['balance']}") messagebox.showinfo("Баланс", msg)