import sys import os import subprocess import logging import customtkinter as ctk import threading from concurrent.futures import ThreadPoolExecutor from douyin_imbot.ui.main_window import MainWindow from douyin_imbot.config.settings import load_settings from douyin_imbot.utils.logger import setup_logger logger = logging.getLogger(__name__) def ensure_playwright_browsers(): """确保Playwright浏览器已安装""" try: # 尝试导入playwright,检查是否已安装 from playwright.sync_api import sync_playwright # 检查是否已安装浏览器 try: with sync_playwright() as p: # 尝试启动浏览器,如果失败则需要安装 browser = p.chromium.launch() browser.close() logger.info("Playwright浏览器已安装") return True except Exception: logger.warning("Playwright浏览器未安装,正在安装...") # 安装浏览器 try: result = subprocess.run( [sys.executable, "-m", "playwright", "install", "chromium"], check=True, capture_output=True, text=True, ) logger.info("Playwright浏览器安装成功") return True except subprocess.CalledProcessError as e: logger.error(f"安装Playwright浏览器失败: {e.stderr}") return False except ImportError: logger.error("请先安装Playwright: pip install playwright") return False def main(): """应用程序主入口点.""" # 设置日志记录器 setup_logger() # 确保Playwright浏览器已安装 if not ensure_playwright_browsers(): print("无法启动应用程序,请确保Playwright及其浏览器已正确安装") return # 加载配置 settings = load_settings() # 获取要启动的浏览器数量(默认为1) browser_count = settings.get("browser_count", 1) # 创建线程池用于管理浏览器实例 settings["browser_executor"] = ThreadPoolExecutor(max_workers=browser_count) settings["browser_threads"] = [] logger.info(f"配置启动 {browser_count} 个浏览器实例") # 设置 CustomTkinter 外观 ctk.set_appearance_mode(settings.get("theme", "System")) # 系统模式,跟随系统主题 ctk.set_default_color_theme(settings.get("color_theme", "blue")) # 默认颜色主题 # 创建并启动 CustomTkinter 应用 app = MainWindow(settings) # 添加线程管理和关闭钩子 def on_closing(): logger.info("正在关闭应用程序和所有浏览器实例...") # 关闭所有浏览器线程 if "browser_executor" in settings: settings["browser_executor"].shutdown(wait=True) app.destroy() app.protocol("WM_DELETE_WINDOW", on_closing) app.mainloop() if __name__ == "__main__": main()