113 lines
3.9 KiB
Python
113 lines
3.9 KiB
Python
"""
|
|
启动进度窗口 — 无边框小窗口,负责整个初始化流程。
|
|
"""
|
|
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
|