#!/usr/bin/env python3 import sys import os import json from PySide6.QtWidgets import QApplication from qt_material import apply_stylesheet from hookvision.config_loader import load_config from hookvision.main_window_v2 import MainWindow import logging log_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "hookvision.log") logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[logging.FileHandler(log_path, encoding='utf-8'), logging.StreamHandler()]) def _autostart_diag(): log = [] log.append(f"sys.executable = {sys.executable}") log.append(f"sys.platform = {sys.platform}") log.append(f"frozen = {getattr(sys, 'frozen', False)}") config_dir = os.path.join(os.path.expanduser("~"), ".config", "HookVision") config_path = os.path.join(config_dir, "autostart.json") log.append(f"config_path = {config_path}") try: os.makedirs(config_dir, exist_ok=True) with open(config_path, "w", encoding="utf-8") as f: json.dump({"enabled": True}, f) with open(config_path, "r", encoding="utf-8") as f: data = json.load(f) log.append(f"JSON OK: {data}") os.remove(config_path) except Exception as e: log.append(f"JSON FAIL: {e}") if sys.platform != "win32": desktop_path = os.path.expanduser("~/.config/autostart/HookVision.desktop") log.append(f"Linux autostart path = {desktop_path}") msg = "\n".join(log) print(msg) with open("autostart_diag.txt", "w", encoding="utf-8") as f: f.write(msg) def main(): if "--autostart-test" in sys.argv: _autostart_diag() return app = QApplication(sys.argv) apply_stylesheet(app, theme='dark_teal.xml') is_frozen = getattr(sys, 'frozen', False) config_name = "config.prod.ini" if is_frozen else "config.dev.ini" if "--prod" in sys.argv: config_name = "config.prod.ini" if "--dev" in sys.argv: config_name = "config.dev.ini" if is_frozen: # PyInstaller 打包后,优先读取可执行文件同目录的配置(部署目录) # 而不是临时解压目录 sys._MEIPASS(打包时嵌入的默认配置) app_dir = os.path.dirname(sys.executable) app_config = os.path.join(app_dir, config_name) if os.path.exists(app_config): config_path = app_config else: config_path = os.path.join(sys._MEIPASS, config_name) else: config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), config_name) config = load_config(config_path) window = MainWindow(config, config_path) window.show() sys.exit(app.exec()) if __name__ == "__main__": main()