""" 启动进度窗口 — 无边框小窗口,负责整个初始化流程。 """ import time import tkinter as tk from tkinter import ttk, messagebox class SplashWindow: """初始化进度窗口,所有者启动逻辑""" def __init__(self): self.root = tk.Tk() self.root.title("神之一手") self.root.geometry("380x120") self.root.resizable(False, False) self.root.overrideredirect(True) self.root.update_idletasks() sw = self.root.winfo_screenwidth() sh = self.root.winfo_screenheight() w, h = 380, 120 self.root.geometry(f"{w}x{h}+{(sw - w) // 2}+{(sh - h) // 2}") frame = ttk.Frame(self.root, padding=20) frame.pack(fill=tk.BOTH, expand=True) ttk.Label(frame, text="神之一手", font=('Microsoft YaHei', 14, 'bold')).pack(pady=(0, 5)) self._status = ttk.Label(frame, text="正在初始化...", font=('Microsoft YaHei', 9)) self._status.pack(pady=(0, 10)) self._bar = ttk.Progressbar(frame, mode='determinate', length=340) self._bar.pack() self.root.update() def progress(self, text: str, pct: float): self._status.configure(text=text) self._bar.configure(value=pct) self.root.update() def _destroy(self): self.root.destroy() def run(self): """执行完整启动流程,成功返回主窗口,失败返回 None""" from core.qmt_real import RealQmtV, qmtv as selected_qmtv while True: _t_total = time.time() # 步骤1: 探测 QMT 环境 self.progress("正在检查 QMT 环境...", 10) _t = time.time() try: discovered = RealQmtV._discover_qmt_port() except Exception: discovered = 0 print(f'[计时] 步骤1-探测QMT环境: {time.time() - _t:.2f}s') if not discovered: self._destroy() messagebox.showerror( "启动失败", "未能自动探测到 QMT 环境。\n\n" "请确认:\n" "1. 极简QMT(GJQMT)已启动并登录\n" "2. XtMiniQmt.exe 和 miniquote.exe 进程在运行" ) return None # 步骤2: 初始化交易器 self.progress("正在初始化交易器...", 35) _t = time.time() selected_qmtv.init_qmtv() print(f'[计时] 步骤2-初始化交易器: {time.time() - _t:.2f}s') # 步骤3: 连接 QMT self.progress("正在连接 QMT...", 55) _t = time.time() connected = selected_qmtv.connect() print(f'[计时] 步骤3-连接QMT: {time.time() - _t:.2f}s') if not connected: self._destroy() option = messagebox.askokcancel( "连接失败", "QMT 连接失败。\n\n" "请确认极简QMT 已启动并登录交易账号。\n" "点击「确定」重试,或「取消」退出。" ) if not option: return None # 重试:重新创建进度窗口 self.__init__() continue # 步骤4: 加载主界面 self.progress("正在加载持仓与策略...", 75) _t = time.time() from core.ui.tkinter.main_window import MainWindow window = MainWindow('INFO', progress=lambda t, p: self.progress(t, 75 + p * 0.2)) print(f'[计时] 步骤4-主界面加载: {time.time() - _t:.2f}s') window.root.update() # 步骤5: 完成 self.progress("启动完成", 100) self.root.update() self.root.after(300, self._destroy) print(f'[计时] 总启动耗时: {time.time() - _t_total:.2f}s') return window