first commit

This commit is contained in:
jianxin committed 2025-04-02 21:01:25 +08:00
commit 4890793ce5
1029 files changed
+5992

No files matched your search

+93
View File
@@ -0,0 +1,93 @@
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()