From 4ee3ac066e561ca73389495f1b3d2458a01ac688 Mon Sep 17 00:00:00 2001 From: huangzhenpc Date: Thu, 13 Feb 2025 10:44:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96:=20?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=89=98=E7=9B=98=E4=B8=8E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9E=84=E5=BB=BA=201.=20=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=89=98=E7=9B=98=E5=8A=9F=E8=83=BD=E5=A2=9E=E5=BC=BA=20-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=98=E7=9B=98=E5=8F=B3=E9=94=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E5=88=B7=E6=96=B0=E9=87=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20-=20=E4=BC=98=E5=8C=96=E6=89=98=E7=9B=98=E5=9B=BE=E6=A0=87?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=92=8C=E7=AE=A1=E7=90=86=20-=20=E6=94=B9?= =?UTF-8?q?=E8=BF=9B=E6=9C=80=E5=B0=8F=E5=8C=96=E5=88=B0=E6=89=98=E7=9B=98?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=202.=20=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=89=88=E6=9C=AC=E6=9E=84=E5=BB=BA=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=20-=20=E6=96=B0=E5=A2=9E=20testbuild.bat=20=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9E=84=E5=BB=BA=E8=84=9A=E6=9C=AC=20-=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=80=92=E5=A2=9E=20-=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC=E4=B8=93=E7=94=A8=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E7=9B=AE=E5=BD=95=203.=20=E5=85=B6=E4=BB=96=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20-=20=E4=BC=98=E5=8C=96=20SSL=20=E8=AD=A6=E5=91=8A?= =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=A4=84=E7=90=86=20-=20=E6=94=B9=E8=BF=9B?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=AF=B9=E8=AF=9D=E6=A1=86=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=80=BB=E8=BE=91=20-=20=E5=AE=8C=E5=96=84=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E7=AE=A1=E7=90=86=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- gui/main_window.py | 131 +++++++++++++++++++++++++++++++++------------ main.py | 16 ++++-- testbuild.bat | 51 ++++++++++++++++++ version.txt | 2 +- 5 files changed, 164 insertions(+), 40 deletions(-) create mode 100644 testbuild.bat diff --git a/.gitignore b/.gitignore index f936809..9d9a272 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,6 @@ venv/ env/ # Local development settings -.env \ No newline at end of file +.env + +testversion.txt \ No newline at end of file diff --git a/gui/main_window.py b/gui/main_window.py index 83c836c..358927f 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -153,33 +153,15 @@ class MainWindow(QMainWindow): # 设置窗口图标 icon_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "icon", "two.ico") if os.path.exists(icon_path): - window_icon = QIcon(icon_path) - if not window_icon.isNull(): - self.setWindowIcon(window_icon) + self.window_icon = QIcon(icon_path) + if not self.window_icon.isNull(): + self.setWindowIcon(self.window_icon) logging.info(f"成功设置窗口图标: {icon_path}") else: logging.warning("图标文件加载失败") # 创建系统托盘图标 - self.tray_icon = QSystemTrayIcon(self) - self.tray_icon.setIcon(self.windowIcon()) - self.tray_icon.setToolTip("听泉Cursor助手") - - # 创建托盘菜单 - tray_menu = QMenu() - show_action = tray_menu.addAction("显示主窗口") - show_action.triggered.connect(self.show) - quit_action = tray_menu.addAction("退出") - quit_action.triggered.connect(QApplication.instance().quit) - - # 设置托盘菜单 - self.tray_icon.setContextMenu(tray_menu) - - # 连接托盘图标的信号 - self.tray_icon.activated.connect(self.on_tray_icon_activated) - - # 显示托盘图标 - self.tray_icon.show() + self.create_tray_icon() # 创建主窗口部件 central_widget = QWidget() @@ -324,24 +306,103 @@ class MainWindow(QMainWindow): # 启动时检查一次状态 QTimer.singleShot(0, self.check_status) + def create_tray_icon(self): + """创建系统托盘图标""" + try: + # 确保QSystemTrayIcon可用 + if not QSystemTrayIcon.isSystemTrayAvailable(): + logging.error("系统托盘不可用") + return + + self.tray_icon = QSystemTrayIcon(self) + self.tray_icon.setIcon(self.window_icon) + self.tray_icon.setToolTip("听泉Cursor助手") + + # 创建托盘菜单 + self.tray_menu = QMenu() # 保存为实例变量 + + # 添加刷新重置按钮 + refresh_action = self.tray_menu.addAction("刷新重置") + refresh_action.triggered.connect(self.refresh_cursor_auth) + + show_action = self.tray_menu.addAction("显示主窗口") + show_action.triggered.connect(self.show_and_activate) + + # 添加分隔线 + self.tray_menu.addSeparator() + + quit_action = self.tray_menu.addAction("退出") + quit_action.triggered.connect(self.quit_application) + + # 设置托盘菜单 + self.tray_icon.setContextMenu(self.tray_menu) + + # 连接托盘图标的信号 + self.tray_icon.activated.connect(self.on_tray_icon_activated) + + # 显示托盘图标 + self.tray_icon.show() + logging.info("系统托盘图标创建成功") + + except Exception as e: + logging.error(f"创建系统托盘图标失败: {str(e)}") + + def show_and_activate(self): + """显示并激活窗口""" + self.show() + self.setWindowState(self.windowState() & ~Qt.WindowMinimized | Qt.WindowActive) + self.activateWindow() + self.raise_() # 确保窗口在最前面 + + def quit_application(self): + """退出应用程序""" + try: + # 停止定时器 + if self._status_timer: + self._status_timer.stop() + + # 移除托盘图标 + if hasattr(self, 'tray_icon'): + self.tray_icon.setVisible(False) # 先隐藏托盘图标 + self.tray_icon.deleteLater() # 删除托盘图标 + + # 退出应用程序 + QApplication.instance().quit() + + except Exception as e: + logging.error(f"退出应用程序时发生错误: {str(e)}") + QApplication.instance().quit() + def on_tray_icon_activated(self, reason): """处理托盘图标的点击事件""" - if reason == QSystemTrayIcon.DoubleClick: - self.show() - self.activateWindow() + if reason in (QSystemTrayIcon.DoubleClick, QSystemTrayIcon.Trigger): + self.show_and_activate() def closeEvent(self, event): """重写关闭事件,最小化到托盘而不是退出""" - if hasattr(self, 'tray_icon') and self.tray_icon.isVisible(): - event.ignore() - self.hide() - self.tray_icon.showMessage( - "听泉Cursor助手", - "程序已最小化到系统托盘", - QSystemTrayIcon.Information, - 2000 - ) - else: + try: + if hasattr(self, 'tray_icon') and self.tray_icon.isVisible(): + event.ignore() + self.hide() + # 确保托盘图标显示 + self.tray_icon.show() + self.tray_icon.showMessage( + "听泉Cursor助手", + "程序已最小化到系统托盘", + QSystemTrayIcon.Information, + 2000 + ) + else: + # 如果托盘图标不可用,则正常退出 + if self._status_timer: + self._status_timer.stop() + event.accept() + + except Exception as e: + logging.error(f"处理关闭事件时发生错误: {str(e)}") + # 发生错误时,接受关闭事件 + if self._status_timer: + self._status_timer.stop() event.accept() if self._status_timer: diff --git a/main.py b/main.py index 1d9665c..c6b3bfc 100644 --- a/main.py +++ b/main.py @@ -60,6 +60,15 @@ def main(): # 创建QApplication实例 app = QApplication(sys.argv) + # 检查系统托盘是否可用 + if not QSystemTrayIcon.isSystemTrayAvailable(): + logging.error("系统托盘不可用") + QMessageBox.critical(None, "错误", "系统托盘不可用,程序无法正常运行。") + return 1 + + # 设置应用程序不会在最后一个窗口关闭时退出 + app.setQuitOnLastWindowClosed(False) + setup_logging() # 检查Python版本 @@ -103,7 +112,8 @@ def main(): logging.info("正在启动主窗口...") window.show() - sys.exit(app.exec_()) + + return app.exec_() except Exception as e: error_msg = f"程序运行出错: {str(e)}\n{traceback.format_exc()}" @@ -112,7 +122,7 @@ def main(): if QApplication.instance() is None: app = QApplication(sys.argv) QMessageBox.critical(None, "错误", error_msg) - sys.exit(1) + return 1 if __name__ == "__main__": - main() \ No newline at end of file + sys.exit(main()) \ No newline at end of file diff --git a/testbuild.bat b/testbuild.bat new file mode 100644 index 0000000..aab3bd9 --- /dev/null +++ b/testbuild.bat @@ -0,0 +1,51 @@ +@echo off +chcp 65001 >nul +setlocal EnableDelayedExpansion + +REM 激活虚拟环境 +call venv\Scripts\activate.bat + +REM 确保安装了必要的包 +pip install -r requirements.txt + +REM 读取当前版本号 +set /p VERSION=testversion.txt +echo 测试版本号: !TEST_VERSION! + +REM 组合完整版本号 +set FULL_VERSION=%VERSION%.!TEST_VERSION! +echo 完整版本号: !FULL_VERSION! + +REM 创建测试版本输出目录 +if not exist "dist\test" mkdir "dist\test" + +REM 清理旧文件 +if exist "dist\听泉cursor助手%VERSION%.exe" del "dist\听泉cursor助手%VERSION%.exe" +if exist "build" rmdir /s /q "build" + +REM 执行打包 +venv\Scripts\python.exe -m PyInstaller build_nezha.spec --clean + +REM 移动并重命名文件 +move "dist\听泉cursor助手%VERSION%.exe" "dist\test\听泉cursor助手v!FULL_VERSION!.exe" + +echo. +echo 测试版本构建完成! +echo 版本号: v!FULL_VERSION! +echo 文件位置: dist\test\听泉cursor助手v!FULL_VERSION!.exe + +REM 退出虚拟环境 +deactivate +pause \ No newline at end of file diff --git a/version.txt b/version.txt index aa00c92..fbcbf73 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -3.3.9 \ No newline at end of file +3.4.0 \ No newline at end of file