实现更新版本管理
This commit is contained in:
171
main.py
171
main.py
@@ -25,12 +25,6 @@ class UpdateSignals(QObject):
|
||||
update_available = pyqtSignal(str, str) # (latest_version, download_url)
|
||||
|
||||
|
||||
# 新增: 断开连接信号类(用于线程安全的通知)
|
||||
class DisconnectSignals(QObject):
|
||||
"""断开连接信号"""
|
||||
account_disconnected = pyqtSignal(str) # (disconnect_message)
|
||||
|
||||
|
||||
# 新增: 用户名密码输入对话框类
|
||||
class LoginWindow(QMainWindow):
|
||||
def __init__(self):
|
||||
@@ -55,10 +49,6 @@ class LoginWindow(QMainWindow):
|
||||
# 创建版本更新信号对象(线程安全)
|
||||
self.update_signals = UpdateSignals()
|
||||
self.update_signals.update_available.connect(self._show_update_dialog)
|
||||
|
||||
# 创建断开连接信号对象(线程安全)
|
||||
self.disconnect_signals = DisconnectSignals()
|
||||
self.disconnect_signals.account_disconnected.connect(self._show_disconnect_dialog)
|
||||
|
||||
self.initUI()
|
||||
|
||||
@@ -446,78 +436,6 @@ class LoginWindow(QMainWindow):
|
||||
|
||||
except Exception as e:
|
||||
self.add_log(f"处理token错误失败: {e}", "ERROR")
|
||||
|
||||
def on_disconnect(self, disconnect_msg: str):
|
||||
"""处理被踢下线通知(可能在子线程中调用)"""
|
||||
try:
|
||||
self.add_log(f"⚠️ 收到断开通知: {disconnect_msg}", "WARNING")
|
||||
# 通过信号发射到主线程(线程安全)
|
||||
self.disconnect_signals.account_disconnected.emit(disconnect_msg)
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 处理断开通知失败: {e}", "ERROR")
|
||||
|
||||
def _show_disconnect_dialog(self, disconnect_msg: str):
|
||||
"""显示断开连接对话框(信号槽函数,在主线程中执行)"""
|
||||
try:
|
||||
self.add_log(f"⚠️ 显示断开连接对话框: {disconnect_msg}", "WARNING")
|
||||
|
||||
# 显示警告对话框
|
||||
QMessageBox.warning(
|
||||
self,
|
||||
"连接已断开",
|
||||
f"{disconnect_msg}\n\n请确保用户只在一台设备登录。",
|
||||
QMessageBox.Ok
|
||||
)
|
||||
|
||||
# 断开所有连接
|
||||
self._disconnect_all_connections()
|
||||
|
||||
# 重置 UI 状态(返回登录界面)
|
||||
self._reset_to_login_state()
|
||||
|
||||
self.add_log("✅ 已断开连接,返回登录界面", "INFO")
|
||||
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 显示断开对话框失败: {e}", "ERROR")
|
||||
import traceback
|
||||
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
|
||||
|
||||
def _disconnect_all_connections(self):
|
||||
"""断开所有连接"""
|
||||
try:
|
||||
self.add_log("🔌 正在断开所有连接...", "INFO")
|
||||
|
||||
# 使用 WebSocket 管理器断开所有连接
|
||||
from WebSocket.backend_singleton import get_websocket_manager
|
||||
ws_manager = get_websocket_manager()
|
||||
ws_manager.disconnect_all()
|
||||
|
||||
self.add_log("✅ 所有连接已断开", "SUCCESS")
|
||||
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 断开连接失败: {e}", "ERROR")
|
||||
|
||||
def _reset_to_login_state(self):
|
||||
"""重置到登录状态"""
|
||||
try:
|
||||
# 清空已连接平台列表
|
||||
self.connected_platforms.clear()
|
||||
|
||||
# 重置状态标签
|
||||
self.status_label.setText("等待连接...")
|
||||
self.status_label.setStyleSheet(
|
||||
"color: #95a5a6; margin-top: 5px;")
|
||||
|
||||
# 重置按钮状态
|
||||
self.login_btn.setEnabled(True)
|
||||
self.login_btn.setText("重新连接")
|
||||
self.login_btn.setObjectName("loginButton") # 恢复原始样式
|
||||
self.login_btn.setStyleSheet(self.login_btn.styleSheet()) # 刷新样式
|
||||
|
||||
self.add_log("✅ UI 已重置到登录状态", "DEBUG")
|
||||
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 重置 UI 状态失败: {e}", "ERROR")
|
||||
|
||||
def delayed_platform_summary(self):
|
||||
"""定时器触发的汇总显示更新"""
|
||||
@@ -733,8 +651,7 @@ class LoginWindow(QMainWindow):
|
||||
success=lambda: self.add_log("WebSocket连接管理器连接成功", "SUCCESS"),
|
||||
error=lambda error: self.add_log(f"WebSocket连接管理器错误: {error}", "ERROR"),
|
||||
platform_connected=self.on_platform_connected, # 新增:平台连接回调
|
||||
token_error=self.on_token_error, # 新增:token错误回调
|
||||
disconnect=self.on_disconnect # 新增:被踢下线回调
|
||||
token_error=self.on_token_error # 新增:token错误回调
|
||||
)
|
||||
|
||||
# 连接后端
|
||||
@@ -915,47 +832,53 @@ class LoginWindow(QMainWindow):
|
||||
return ""
|
||||
|
||||
def trigger_update(self, download_url, latest_version):
|
||||
"""触发更新下载"""
|
||||
try:
|
||||
# 检查下载地址是否有效
|
||||
if not download_url or download_url.strip() == "":
|
||||
self.add_log("⚠️ 下载地址为空,无法打开更新页面", "WARNING")
|
||||
QMessageBox.warning(
|
||||
self,
|
||||
"下载地址缺失",
|
||||
f"版本 {latest_version} 的下载地址暂未配置。\n\n请联系管理员或稍后再试。",
|
||||
QMessageBox.Ok
|
||||
)
|
||||
return
|
||||
|
||||
self.add_log(f"📂 准备打开下载页面: {download_url}", "INFO")
|
||||
|
||||
# 使用线程安全的方式打开浏览器
|
||||
"""触发更新下载(不阻塞主程序)"""
|
||||
import webbrowser
|
||||
import threading
|
||||
|
||||
# 检查下载地址是否有效
|
||||
if not download_url or download_url.strip() == "":
|
||||
self.add_log("⚠️ 下载地址为空,无法打开更新页面", "WARNING")
|
||||
QMessageBox.warning(
|
||||
self,
|
||||
"下载地址缺失",
|
||||
f"版本 {latest_version} 的下载地址暂未配置。\n\n请联系管理员或稍后再试。",
|
||||
QMessageBox.Ok
|
||||
)
|
||||
return
|
||||
|
||||
# 明确提示用户即将下载
|
||||
reply = QMessageBox.information(
|
||||
self,
|
||||
"准备下载更新",
|
||||
f"即将打开浏览器下载 v{latest_version} 安装包。\n\n"
|
||||
f"下载完成后请:\n"
|
||||
f"1. 关闭本程序\n"
|
||||
f"2. 运行下载的安装包\n"
|
||||
f"3. 按照提示完成更新\n\n"
|
||||
f"点击确定继续...",
|
||||
QMessageBox.Ok | QMessageBox.Cancel,
|
||||
QMessageBox.Ok
|
||||
)
|
||||
|
||||
if reply == QMessageBox.Cancel:
|
||||
self.add_log("用户取消下载", "INFO")
|
||||
return
|
||||
|
||||
self.add_log(f"📂 准备打开下载页面: {download_url}", "INFO")
|
||||
|
||||
# 在独立线程中打开浏览器,确保不阻塞GUI主线程
|
||||
def open_browser_thread():
|
||||
try:
|
||||
import webbrowser
|
||||
import threading
|
||||
|
||||
def open_browser():
|
||||
"""在独立线程中打开浏览器,避免阻塞主线程"""
|
||||
try:
|
||||
webbrowser.open(download_url)
|
||||
self.add_log("✅ 浏览器已打开", "SUCCESS")
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 打开浏览器失败: {e}", "ERROR")
|
||||
|
||||
# 在新线程中打开浏览器
|
||||
browser_thread = threading.Thread(target=open_browser, daemon=True)
|
||||
browser_thread.start()
|
||||
|
||||
self.add_log(f"✅ 已启动浏览器线程", "INFO")
|
||||
|
||||
except Exception as browser_error:
|
||||
self.add_log(f"❌ 浏览器线程启动失败: {browser_error}", "ERROR")
|
||||
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 触发更新失败: {e}", "ERROR")
|
||||
import traceback
|
||||
self.add_log(f"详细错误: {traceback.format_exc()}", "ERROR")
|
||||
webbrowser.open(download_url)
|
||||
self.add_log("✅ 浏览器已打开,下载即将开始", "SUCCESS")
|
||||
except Exception as e:
|
||||
self.add_log(f"❌ 打开浏览器失败: {e}", "ERROR")
|
||||
|
||||
thread = threading.Thread(target=open_browser_thread, daemon=True)
|
||||
thread.start()
|
||||
|
||||
self.add_log("✅ 已启动下载,程序继续运行", "INFO")
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
Reference in New Issue
Block a user