94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
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()
|