"""
语言培训班管理系统 - 主程序
基于Python Tkinter + ttk构建的现代化桌面应用
"""
import tkinter as tk
from tkinter import ttk, messagebox
import sys
import os
from pathlib import Path
添加当前目录到Python路径
current_dir = Path(file).parent
sys.path.insert(0, str(current_dir))
from config import *
from ui.main_window import MainWindow
from utils.logger import LoggerManager
from data.data_manager import DataManager
from data.backup_manager import BackupManager
from course_module import CourseManager
from teacher_module import TeacherManager
class TrainingManagementSystem:
"""培训班管理系统主类"""
def __init__(self):
"""初始化系统"""
self.root = None
self.logger = None
self.data_manager = None
self.teacher_manager = None
self.backup_manager = None
self.main_window = None
def setup_logging(self):
"""设置日志系统"""
try:
self.logger_manager = LoggerManager()
self.logger = self.logger_manager.get_logger(__name__)
self.logger.info(f"{APP_NAME} v{APP_VERSION} 启动")
except Exception as e:
messagebox.showerror("错误", f"日志系统初始化失败: {e}")
return False
return True
def setup_data_management(self):
"""设置数据管理"""
try:
self.data_manager = DataManager(DATA_DIR, self.logger)
self.teacher_manager = TeacherManager(DATA_DIR, self.logger)
self.logger.info("数据管理系统初始化成功")
except Exception as e:
self.logger.error(f"数据管理系统初始化失败: {e}")
messagebox.showerror("错误", f"数据管理系统初始化失败: {e}")
return False
return True
def setup_backup_system(self):
"""设置备份系统"""
try:
self.backup_manager = BackupManager(DATA_DIR, BACKUP_DIR, self.logger)
# 启动自动备份
if AUTO_BACKUP_ENABLED:
self.backup_manager.start_auto_backup(BACKUP_INTERVAL_HOURS)
self.logger.info(f"自动备份已启动,间隔: {BACKUP_INTERVAL_HOURS}小时")
self.logger.info("备份系统初始化成功")
except Exception as e:
self.logger.error(f"备份系统初始化失败: {e}")
# 备份系统失败不影响主程序运行
messagebox.showwarning("警告", f"备份系统初始化失败: {e}")
def create_main_window(self):
"""创建主窗口"""
try:
self.root = tk.Tk()
self.root.title(f"{APP_NAME} v{APP_VERSION}")
self.root.geometry(f"{APP_WIDTH}x{APP_HEIGHT}")
self.root.configure(bg=BACKGROUND_COLOR)
self.root.minsize(1024, 600)
# 设置窗口图标(如果有的话)
icon_path = current_dir / "assets" / "icon.ico"
if icon_path.exists():
try:
self.root.iconbitmap(str(icon_path))
except Exception:
pass # 图标加载失败不影响程序运行
# 创建主界面
self.main_window = MainWindow(self.root, self.data_manager, self.logger, self.backup_manager, self.teacher_manager)
self.logger.info("主界面创建成功")
except Exception as e:
self.logger.error(f"主窗口创建失败: {e}")
messagebox.showerror("错误", f"主窗口创建失败: {e}")
return False
return True
def run(self):
"""运行应用程序"""
try:
# 初始化日志系统
if not self.logger:
self.setup_logging()
self.logger.info("应用程序启动")
# 初始化数据管理系统
if not self.data_manager or not self.teacher_manager:
self.logger.debug("开始初始化数据管理系统")
self.setup_data_management()
self.logger.info("数据管理系统初始化完成")
# 初始化备份系统
if not self.backup_manager:
self.logger.debug("开始初始化备份系统")
self.setup_backup_system()
self.logger.info("备份系统初始化完成")
# 创建主窗口
self.logger.debug("开始创建主界面")
self.root = tk.Tk()
self.root.title(f"{APP_NAME} v{APP_VERSION}")
self.root.geometry(f"{APP_WIDTH}x{APP_HEIGHT}")
self.root.configure(bg=BACKGROUND_COLOR)
self.root.minsize(1024, 600)
# 设置窗口图标(如果有的话)
icon_path = current_dir / "assets" / "icon.ico"
if icon_path.exists():
try:
self.root.iconbitmap(str(icon_path))
except Exception:
pass # 图标加载失败不影响程序运行
self.main_window = MainWindow(self.root, self.data_manager, self.logger, self.backup_manager, self.teacher_manager)
self.logger.info("主界面创建完成")
# 启动主循环
self.root.mainloop()
except Exception as e:
self.logger.error(f"应用程序运行失败: {e}")
self.logger.exception("详细的错误信息:")
messagebox.showerror("错误", f"应用程序运行失败: {e}")
raise
def cleanup(self):
"""清理资源"""
if self.backup_manager:
self.backup_manager.stop_auto_backup()
if self.logger:
self.logger.info("应用程序关闭")
def main():
"""主函数"""
try:
创建应用程序实例
app = TrainingManagementSystem()
# 运行应用程序
app.run()
# 清理资源
app.cleanup()
# 正常退出
sys.exit(0)
except Exception as e:
messagebox.showerror("严重错误", f"应用程序无法启动: {e}")
sys.exit(1)
if name == "main":
main()