1
0

Зеленский Павел.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import tkinter as tk
  2. from tkinter import ttk
  3. import sqlite3
  4. from datetime import datetime
  5. # Создание или подключение к базе данных SQLite
  6. def create_db():
  7. conn = sqlite3.connect('finance_tracker.db')
  8. cursor = conn.cursor()
  9. cursor.execute('''
  10. CREATE TABLE IF NOT EXISTS transactions (
  11. id INTEGER PRIMARY KEY AUTOINCREMENT,
  12. amount REAL,
  13. category TEXT,
  14. transaction_type TEXT,
  15. description TEXT,
  16. date TEXT
  17. )
  18. ''')
  19. conn.commit()
  20. conn.close()
  21. # Функция для добавления записи в базу данных
  22. def add_transaction(amount, category, transaction_type, description):
  23. date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  24. conn = sqlite3.connect('finance_tracker.db')
  25. cursor = conn.cursor()
  26. cursor.execute('''
  27. INSERT INTO transactions (amount, category, transaction_type, description, date)
  28. VALUES (?, ?, ?, ?, ?)
  29. ''', (amount, category, transaction_type, description, date))
  30. conn.commit()
  31. conn.close()
  32. # Функция для отображения всех записей из базы данных
  33. def show_transactions(treeview):
  34. for row in treeview.get_children():
  35. treeview.delete(row)
  36. conn = sqlite3.connect('finance_tracker.db')
  37. cursor = conn.cursor()
  38. cursor.execute('SELECT amount, category, transaction_type, description, date FROM transactions ORDER BY date DESC')
  39. rows = cursor.fetchall()
  40. conn.close()
  41. for row in rows:
  42. treeview.insert("", "end", values=row)
  43. # Функция для подсчета общей суммы доходов, расходов и разности
  44. def calculate_totals():
  45. conn = sqlite3.connect('finance_tracker.db')
  46. cursor = conn.cursor()
  47. cursor.execute('SELECT * FROM transactions')
  48. rows = cursor.fetchall()
  49. conn.close()
  50. total_income = 0
  51. total_expense = 0
  52. for row in rows:
  53. amount = row[1]
  54. transaction_type = row[3]
  55. if transaction_type == 'Доход':
  56. total_income += amount
  57. elif transaction_type == 'Расход':
  58. total_expense += amount
  59. balance = total_income - total_expense
  60. return total_income, total_expense, balance
  61. # Обновление отображения общей суммы и разности
  62. def update_totals(label_income, label_expense, label_balance):
  63. total_income, total_expense, balance = calculate_totals()
  64. label_income.config(text=f"Общий доход: {total_income:.2f} руб.")
  65. label_expense.config(text=f"Общие расходы: {total_expense:.2f} руб.")
  66. label_balance.config(text=f"Разность: {balance:.2f} руб.")
  67. # Добавление транзакции через форму
  68. def add_transaction_from_form(entry_amount, combo_category, combo_type, entry_description):
  69. try:
  70. amount = float(entry_amount.get())
  71. category = combo_category.get()
  72. transaction_type = combo_type.get()
  73. description = entry_description.get()
  74. if amount <= 0 or not category or not transaction_type:
  75. raise ValueError("Заполните все обязательные поля!")
  76. add_transaction(amount, category, transaction_type, description)
  77. update_totals(label_income, label_expense, label_balance)
  78. show_transactions(treeview)
  79. # Очистка полей
  80. entry_amount.delete(0, tk.END)
  81. combo_category.set("")
  82. combo_type.set("")
  83. entry_description.delete(0, tk.END)
  84. except ValueError as e:
  85. print(f"Ошибка: {e}")
  86. # Создание графического интерфейса
  87. def create_gui():
  88. root = tk.Tk()
  89. root.title("Учет финансов")
  90. # Лейблы для общей суммы и разности
  91. global label_income, label_expense, label_balance
  92. label_income = tk.Label(root, text="Общий доход: 0.00 руб.", font=("Arial", 14))
  93. label_income.pack(pady=5)
  94. label_expense = tk.Label(root, text="Общие расходы: 0.00 руб.", font=("Arial", 14))
  95. label_expense.pack(pady=5)
  96. label_balance = tk.Label(root, text="Разность: 0.00 руб.", font=("Arial", 14))
  97. label_balance.pack(pady=5)
  98. # Форма для добавления транзакции
  99. frame_input = tk.Frame(root)
  100. frame_input.pack(pady=10)
  101. tk.Label(frame_input, text="Сумма:").grid(row=0, column=0)
  102. entry_amount = tk.Entry(frame_input)
  103. entry_amount.grid(row=0, column=1)
  104. tk.Label(frame_input, text="Категория:").grid(row=1, column=0)
  105. combo_category = ttk.Combobox(frame_input, values=["Продукты", "Транспорт", "Развлечения", "Счета", "Зарплата", "Другое"])
  106. combo_category.grid(row=1, column=1)
  107. tk.Label(frame_input, text="Тип:").grid(row=2, column=0)
  108. combo_type = ttk.Combobox(frame_input, values=["Доход", "Расход"])
  109. combo_type.grid(row=2, column=1)
  110. tk.Label(frame_input, text="Описание:").grid(row=3, column=0)
  111. entry_description = tk.Entry(frame_input, width=40)
  112. entry_description.grid(row=3, column=1)
  113. button_add = tk.Button(frame_input, text="Добавить транзакцию",
  114. command=lambda: add_transaction_from_form(entry_amount, combo_category, combo_type, entry_description))
  115. button_add.grid(row=4, column=0, columnspan=2, pady=10)
  116. # Таблица для отображения транзакций
  117. global treeview
  118. treeview = ttk.Treeview(root, columns=("Сумма", "Категория", "Тип", "Описание", "Дата"), show="headings")
  119. treeview.heading("Сумма", text="Сумма")
  120. treeview.heading("Категория", text="Категория")
  121. treeview.heading("Тип", text="Тип")
  122. treeview.heading("Описание", text="Описание")
  123. treeview.heading("Дата", text="Дата")
  124. treeview.pack(pady=10)
  125. # Кнопка для отображения всех транзакций
  126. button_show = tk.Button(root, text="Показать все транзакции", command=lambda: show_transactions(treeview))
  127. button_show.pack(pady=10)
  128. # Инициализация базы данных и начальное обновление данных
  129. create_db()
  130. update_totals(label_income, label_expense, label_balance)
  131. show_transactions(treeview)
  132. root.mainloop()
  133. if __name__ == "__main__":
  134. create_gui()