|
@@ -0,0 +1,162 @@
|
|
|
+import tkinter as tk
|
|
|
+from tkinter import ttk
|
|
|
+import sqlite3
|
|
|
+from datetime import datetime
|
|
|
+
|
|
|
+# Создание или подключение к базе данных SQLite
|
|
|
+def create_db():
|
|
|
+ conn = sqlite3.connect('finance_tracker.db')
|
|
|
+ cursor = conn.cursor()
|
|
|
+ cursor.execute('''
|
|
|
+ CREATE TABLE IF NOT EXISTS transactions (
|
|
|
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
+ amount REAL,
|
|
|
+ category TEXT,
|
|
|
+ transaction_type TEXT,
|
|
|
+ description TEXT,
|
|
|
+ date TEXT
|
|
|
+ )
|
|
|
+ ''')
|
|
|
+ conn.commit()
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+# Функция для добавления записи в базу данных
|
|
|
+def add_transaction(amount, category, transaction_type, description):
|
|
|
+ date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
|
+ conn = sqlite3.connect('finance_tracker.db')
|
|
|
+ cursor = conn.cursor()
|
|
|
+ cursor.execute('''
|
|
|
+ INSERT INTO transactions (amount, category, transaction_type, description, date)
|
|
|
+ VALUES (?, ?, ?, ?, ?)
|
|
|
+ ''', (amount, category, transaction_type, description, date))
|
|
|
+ conn.commit()
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+# Функция для отображения всех записей из базы данных
|
|
|
+def show_transactions(treeview):
|
|
|
+ for row in treeview.get_children():
|
|
|
+ treeview.delete(row)
|
|
|
+
|
|
|
+ conn = sqlite3.connect('finance_tracker.db')
|
|
|
+ cursor = conn.cursor()
|
|
|
+ cursor.execute('SELECT amount, category, transaction_type, description, date FROM transactions ORDER BY date DESC')
|
|
|
+ rows = cursor.fetchall()
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+ for row in rows:
|
|
|
+ treeview.insert("", "end", values=row)
|
|
|
+
|
|
|
+# Функция для подсчета общей суммы доходов, расходов и разности
|
|
|
+def calculate_totals():
|
|
|
+ conn = sqlite3.connect('finance_tracker.db')
|
|
|
+ cursor = conn.cursor()
|
|
|
+ cursor.execute('SELECT * FROM transactions')
|
|
|
+ rows = cursor.fetchall()
|
|
|
+ conn.close()
|
|
|
+
|
|
|
+ total_income = 0
|
|
|
+ total_expense = 0
|
|
|
+ for row in rows:
|
|
|
+ amount = row[1]
|
|
|
+ transaction_type = row[3]
|
|
|
+ if transaction_type == 'Доход':
|
|
|
+ total_income += amount
|
|
|
+ elif transaction_type == 'Расход':
|
|
|
+ total_expense += amount
|
|
|
+
|
|
|
+ balance = total_income - total_expense
|
|
|
+ return total_income, total_expense, balance
|
|
|
+
|
|
|
+# Обновление отображения общей суммы и разности
|
|
|
+def update_totals(label_income, label_expense, label_balance):
|
|
|
+ total_income, total_expense, balance = calculate_totals()
|
|
|
+ label_income.config(text=f"Общий доход: {total_income:.2f} руб.")
|
|
|
+ label_expense.config(text=f"Общие расходы: {total_expense:.2f} руб.")
|
|
|
+ label_balance.config(text=f"Разность: {balance:.2f} руб.")
|
|
|
+
|
|
|
+# Добавление транзакции через форму
|
|
|
+def add_transaction_from_form(entry_amount, combo_category, combo_type, entry_description):
|
|
|
+ try:
|
|
|
+ amount = float(entry_amount.get())
|
|
|
+ category = combo_category.get()
|
|
|
+ transaction_type = combo_type.get()
|
|
|
+ description = entry_description.get()
|
|
|
+
|
|
|
+ if amount <= 0 or not category or not transaction_type:
|
|
|
+ raise ValueError("Заполните все обязательные поля!")
|
|
|
+
|
|
|
+ add_transaction(amount, category, transaction_type, description)
|
|
|
+ update_totals(label_income, label_expense, label_balance)
|
|
|
+ show_transactions(treeview)
|
|
|
+
|
|
|
+ # Очистка полей
|
|
|
+ entry_amount.delete(0, tk.END)
|
|
|
+ combo_category.set("")
|
|
|
+ combo_type.set("")
|
|
|
+ entry_description.delete(0, tk.END)
|
|
|
+ except ValueError as e:
|
|
|
+ print(f"Ошибка: {e}")
|
|
|
+
|
|
|
+# Создание графического интерфейса
|
|
|
+def create_gui():
|
|
|
+ root = tk.Tk()
|
|
|
+ root.title("Учет финансов")
|
|
|
+
|
|
|
+ # Лейблы для общей суммы и разности
|
|
|
+ global label_income, label_expense, label_balance
|
|
|
+ label_income = tk.Label(root, text="Общий доход: 0.00 руб.", font=("Arial", 14))
|
|
|
+ label_income.pack(pady=5)
|
|
|
+
|
|
|
+ label_expense = tk.Label(root, text="Общие расходы: 0.00 руб.", font=("Arial", 14))
|
|
|
+ label_expense.pack(pady=5)
|
|
|
+
|
|
|
+ label_balance = tk.Label(root, text="Разность: 0.00 руб.", font=("Arial", 14))
|
|
|
+ label_balance.pack(pady=5)
|
|
|
+
|
|
|
+ # Форма для добавления транзакции
|
|
|
+ frame_input = tk.Frame(root)
|
|
|
+ frame_input.pack(pady=10)
|
|
|
+
|
|
|
+ tk.Label(frame_input, text="Сумма:").grid(row=0, column=0)
|
|
|
+ entry_amount = tk.Entry(frame_input)
|
|
|
+ entry_amount.grid(row=0, column=1)
|
|
|
+
|
|
|
+ tk.Label(frame_input, text="Категория:").grid(row=1, column=0)
|
|
|
+ combo_category = ttk.Combobox(frame_input, values=["Продукты", "Транспорт", "Развлечения", "Счета", "Зарплата", "Другое"])
|
|
|
+ combo_category.grid(row=1, column=1)
|
|
|
+
|
|
|
+ tk.Label(frame_input, text="Тип:").grid(row=2, column=0)
|
|
|
+ combo_type = ttk.Combobox(frame_input, values=["Доход", "Расход"])
|
|
|
+ combo_type.grid(row=2, column=1)
|
|
|
+
|
|
|
+ tk.Label(frame_input, text="Описание:").grid(row=3, column=0)
|
|
|
+ entry_description = tk.Entry(frame_input, width=40)
|
|
|
+ entry_description.grid(row=3, column=1)
|
|
|
+
|
|
|
+ button_add = tk.Button(frame_input, text="Добавить транзакцию",
|
|
|
+ command=lambda: add_transaction_from_form(entry_amount, combo_category, combo_type, entry_description))
|
|
|
+ button_add.grid(row=4, column=0, columnspan=2, pady=10)
|
|
|
+
|
|
|
+ # Таблица для отображения транзакций
|
|
|
+ global treeview
|
|
|
+ treeview = ttk.Treeview(root, columns=("Сумма", "Категория", "Тип", "Описание", "Дата"), show="headings")
|
|
|
+ treeview.heading("Сумма", text="Сумма")
|
|
|
+ treeview.heading("Категория", text="Категория")
|
|
|
+ treeview.heading("Тип", text="Тип")
|
|
|
+ treeview.heading("Описание", text="Описание")
|
|
|
+ treeview.heading("Дата", text="Дата")
|
|
|
+ treeview.pack(pady=10)
|
|
|
+
|
|
|
+ # Кнопка для отображения всех транзакций
|
|
|
+ button_show = tk.Button(root, text="Показать все транзакции", command=lambda: show_transactions(treeview))
|
|
|
+ button_show.pack(pady=10)
|
|
|
+
|
|
|
+ # Инициализация базы данных и начальное обновление данных
|
|
|
+ create_db()
|
|
|
+ update_totals(label_income, label_expense, label_balance)
|
|
|
+ show_transactions(treeview)
|
|
|
+
|
|
|
+ root.mainloop()
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ create_gui()
|