286 lines
12 KiB
Python
286 lines
12 KiB
Python
# main.py
|
||
import tkinter as tk
|
||
from tkinter import ttk, messagebox
|
||
import sys
|
||
import os
|
||
|
||
# Добавляем текущую директорию в путь Python
|
||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||
|
||
# Импортируем наши модули
|
||
try:
|
||
from modules.serial_writer import SerialWriterTab
|
||
from modules.bots_module import BotsCountTab
|
||
from modules.light_module import LightModuleTab
|
||
from modules.electronics_module import ElectronicsModuleTab
|
||
from modules.server_module import ServerModuleTab
|
||
except ImportError as e:
|
||
print(f"Ошибка импорта модуля: {e}")
|
||
print("Проверьте, что файлы модулей существуют в папке modules/")
|
||
sys.exit(1)
|
||
|
||
|
||
class ConfiguratorApp:
|
||
def __init__(self, root):
|
||
self.root = root
|
||
self.root.title("🎮 Конфигуратор игры 'Фишка'")
|
||
self.root.geometry("1100x800") # Немного увеличим размер
|
||
|
||
# Центрируем окно
|
||
self.center_window()
|
||
|
||
# Создаем стиль для вкладок
|
||
self.style = ttk.Style()
|
||
self.style.theme_use('clam')
|
||
|
||
# Настраиваем стиль вкладок
|
||
self.style.configure('TNotebook', background='#f0f0f0')
|
||
self.style.configure('TNotebook.Tab',
|
||
padding=[20, 8],
|
||
font=('Arial', 11, 'bold'),
|
||
foreground='#333333')
|
||
|
||
# Стиль для активной вкладки
|
||
self.style.map('TNotebook.Tab',
|
||
background=[('selected', '#2196F3'), ('!selected', '#E0E0E0')],
|
||
foreground=[('selected', 'white'), ('!selected', '#666666')])
|
||
|
||
# Создаем главный контейнер
|
||
self.main_container = ttk.Frame(root)
|
||
self.main_container.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
|
||
|
||
# Создаем Notebook для вкладок
|
||
self.notebook = ttk.Notebook(self.main_container)
|
||
self.notebook.pack(fill=tk.BOTH, expand=True)
|
||
|
||
# Словари для хранения вкладок и модулей
|
||
self.tabs = {}
|
||
self.modules = {}
|
||
|
||
# Инициализируем вкладки
|
||
self.init_tabs()
|
||
|
||
# Загрузка сохраненных данных при запуске
|
||
self.load_saved_data()
|
||
|
||
def center_window(self):
|
||
"""Центрировать окно на экране"""
|
||
self.root.update_idletasks()
|
||
width = 1100
|
||
height = 800
|
||
screen_width = self.root.winfo_screenwidth()
|
||
screen_height = self.root.winfo_screenheight()
|
||
|
||
x = (screen_width - width) // 2
|
||
y = (screen_height - height) // 2
|
||
|
||
self.root.geometry(f'{width}x{height}+{x}+{y}')
|
||
|
||
def init_tabs(self):
|
||
"""Инициализация вкладок с модулями"""
|
||
print("🔧 Инициализация модулей...")
|
||
|
||
# 1. Серийный номер (первая вкладка)
|
||
self.add_module_tab("serial", "📋 СЕРИЙНЫЙ НОМЕР", SerialWriterTab)
|
||
|
||
# 2. Количество ботов (вторая вкладка)
|
||
# self.add_module_tab("bots", "🤖 КОЛИЧЕСТВО БОТОВ", BotsCountTab)
|
||
|
||
# 3. Настройка подсветки (третья вкладка)
|
||
self.add_module_tab("light", "💡 ПОДСВЕТКА", LightModuleTab)
|
||
|
||
self.add_module_tab("electronics", "⚡ ЭЛЕКТРОНИКА", ElectronicsModuleTab)
|
||
|
||
self.add_module_tab("server", "🌐 ВЕБ-СЕРВЕР", ServerModuleTab)
|
||
|
||
print(f"✅ Загружено модулей: {len(self.modules)}")
|
||
|
||
# Устанавливаем первую вкладку активной
|
||
if self.tabs:
|
||
self.notebook.select(0)
|
||
|
||
def add_module_tab(self, module_id, tab_name, module_class):
|
||
"""
|
||
Добавить вкладку с модулем
|
||
|
||
Args:
|
||
module_id: Уникальный идентификатор модуля
|
||
tab_name: Название вкладки
|
||
module_class: Класс модуля
|
||
"""
|
||
print(f" ⏳ Загрузка модуля: {module_id}")
|
||
|
||
try:
|
||
# Создаем фрейм для вкладки
|
||
tab_frame = ttk.Frame(self.notebook)
|
||
|
||
# Добавляем фрейм в notebook
|
||
self.notebook.add(tab_frame, text=tab_name)
|
||
|
||
# Создаем экземпляр модуля
|
||
module_instance = module_class(tab_frame)
|
||
|
||
# Сохраняем модуль
|
||
self.modules[module_id] = module_instance
|
||
self.tabs[tab_name] = {
|
||
'frame': tab_frame,
|
||
'module': module_instance,
|
||
'type': 'module'
|
||
}
|
||
|
||
print(f" ✅ Модуль '{module_id}' загружен успешно")
|
||
|
||
except Exception as e:
|
||
print(f" ❌ Ошибка загрузки модуля '{module_id}': {e}")
|
||
|
||
# Создаем фрейм с ошибкой
|
||
tab_frame = ttk.Frame(self.notebook)
|
||
self.notebook.add(tab_frame, text=f"❌ {tab_name}")
|
||
|
||
error_frame = ttk.Frame(tab_frame, padding=50)
|
||
error_frame.pack(fill=tk.BOTH, expand=True)
|
||
|
||
ttk.Label(
|
||
error_frame,
|
||
text=f"Ошибка загрузки модуля:\n{str(e)}",
|
||
font=('Arial', 12),
|
||
foreground='red',
|
||
justify=tk.CENTER
|
||
).pack(expand=True)
|
||
|
||
self.tabs[tab_name] = {
|
||
'frame': tab_frame,
|
||
'error': str(e),
|
||
'type': 'error'
|
||
}
|
||
|
||
def load_saved_data(self):
|
||
"""Загрузить сохраненные данные при запуске"""
|
||
try:
|
||
# Загружаем серийный номер
|
||
if 'serial' in self.modules:
|
||
if hasattr(self.modules['serial'], 'load_serial_from_file'):
|
||
loaded = self.modules['serial'].load_serial_from_file()
|
||
if loaded:
|
||
print("✓ Серийный номер загружен из файла")
|
||
|
||
# Загружаем настройки подсветки
|
||
if 'light' in self.modules:
|
||
if hasattr(self.modules['light'], 'check_light_version'):
|
||
version = self.modules['light'].check_light_version()
|
||
if version:
|
||
print(f"✓ Версия подсветки загружена: {version}")
|
||
|
||
except Exception as e:
|
||
print(f"Ошибка загрузки данных: {e}")
|
||
|
||
def save_all(self):
|
||
"""Сохранить все данные из всех модулей"""
|
||
saved_modules = []
|
||
errors = []
|
||
|
||
# Сохраняем данные из всех модулей
|
||
for module_id, module in self.modules.items():
|
||
try:
|
||
if hasattr(module, 'save_serial'):
|
||
module.save_serial()
|
||
saved_modules.append("Серийный номер")
|
||
|
||
elif hasattr(module, 'save_bots_amount'):
|
||
module.save_bots_amount()
|
||
saved_modules.append("Количество ботов")
|
||
|
||
elif hasattr(module, 'save_light_config'):
|
||
module.save_light_config()
|
||
saved_modules.append("Подсветка")
|
||
elif hasattr(module, 'save_electro_config'):
|
||
module.save_electro_config()
|
||
saved_modules.append("Электроника")
|
||
elif hasattr(module, 'save_server_config'):
|
||
module.save_server_config()
|
||
saved_modules.append("Веб-сервер")
|
||
|
||
except Exception as e:
|
||
errors.append(f"{module_id}: {str(e)[:50]}...")
|
||
|
||
# Показываем результат
|
||
if saved_modules:
|
||
if errors:
|
||
message = (
|
||
f"✅ Успешно сохранено:\n"
|
||
f"{', '.join(saved_modules)}\n\n"
|
||
f"❌ Ошибки:\n"
|
||
f"{chr(10).join(errors)}"
|
||
)
|
||
messagebox.showwarning("Сохранение с ошибками", message)
|
||
else:
|
||
message = f"✅ Все настройки успешно сохранены!\n\nСохранено: {', '.join(saved_modules)}"
|
||
messagebox.showinfo("Сохранение завершено", message)
|
||
else:
|
||
if errors:
|
||
message = f"❌ Не удалось сохранить данные:\n\n{chr(10).join(errors)}"
|
||
messagebox.showerror("Ошибка сохранения", message)
|
||
else:
|
||
messagebox.showinfo("Сохранение", "Нет данных для сохранения.")
|
||
|
||
def refresh_all(self):
|
||
"""Обновить все модули"""
|
||
for module_id, module in self.modules.items():
|
||
try:
|
||
if hasattr(module, 'update_status'):
|
||
module.update_status()
|
||
elif hasattr(module, 'check_light_version'):
|
||
module.check_light_version()
|
||
except Exception as e:
|
||
print(f"Ошибка обновления модуля {module_id}: {e}")
|
||
|
||
print("✓ Все модули обновлены")
|
||
|
||
def check_all_modules(self):
|
||
"""Проверить все модули"""
|
||
results = []
|
||
|
||
for module_id, module in self.modules.items():
|
||
try:
|
||
if module_id == 'serial':
|
||
serial = module.get_serial_number()
|
||
if serial:
|
||
results.append(f"✅ Серийный номер: {serial}")
|
||
else:
|
||
results.append("⚠️ Серийный номер: не заполнен")
|
||
|
||
elif module_id == 'bots':
|
||
bots = module.get_bots_count()
|
||
results.append(f"✅ Количество ботов: {bots}")
|
||
|
||
elif module_id == 'light':
|
||
version = module.get_current_version()
|
||
if version:
|
||
results.append(f"✅ Версия подсветки: {version}")
|
||
else:
|
||
results.append("⚠️ Подсветка: не настроена")
|
||
elif module_id == 'electronics':
|
||
version = module.get_current_version()
|
||
if version:
|
||
results.append(f"✅ Версия электроники: {version}")
|
||
else:
|
||
results.append("⚠️ Электроника: не настроена")
|
||
|
||
except Exception as e:
|
||
results.append(f"❌ {module_id}: ошибка - {str(e)[:50]}")
|
||
|
||
if results:
|
||
message = "🔍 Результаты проверки всех модулей:\n\n" + "\n".join(results)
|
||
messagebox.showinfo("Проверка настроек", message)
|
||
else:
|
||
messagebox.showinfo("Проверка настроек", "Нет загруженных модулей для проверки.")
|
||
|
||
|
||
def main():
|
||
root = tk.Tk()
|
||
app = ConfiguratorApp(root)
|
||
root.mainloop()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main() |