Files
2025-04-02 21:01:25 +08:00

94 lines
3.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()