feat: 完成PyQt5 GUI实现,支持系统托盘和图标显示
1. 实现了基于PyQt5的GUI界面 2. 添加系统托盘功能,支持最小化到托盘 3. 修复了图标显示问题,包括窗口图标和任务栏图标 4. 优化了打包配置,支持PyInstaller打包 5. 版本更新到v3.3.1
This commit is contained in:
@@ -22,7 +22,7 @@ a = Analysis(
|
|||||||
hookspath=[],
|
hookspath=[],
|
||||||
hooksconfig={},
|
hooksconfig={},
|
||||||
runtime_hooks=[],
|
runtime_hooks=[],
|
||||||
excludes=[],
|
excludes=['_tkinter', 'tkinter', 'Tkinter'], # 排除 tkinter 相关模块
|
||||||
noarchive=False,
|
noarchive=False,
|
||||||
optimize=0,
|
optimize=0,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import os
|
|||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
from PyQt5.QtWidgets import (QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
|
||||||
QLabel, QLineEdit, QPushButton, QFrame, QTextEdit,
|
QLabel, QLineEdit, QPushButton, QFrame, QTextEdit,
|
||||||
QMessageBox, QApplication)
|
QMessageBox, QApplication, QSystemTrayIcon, QMenu)
|
||||||
from PyQt5.QtCore import Qt, QTimer
|
from PyQt5.QtCore import Qt, QTimer
|
||||||
from PyQt5.QtGui import QIcon, QPixmap
|
from PyQt5.QtGui import QIcon, QPixmap
|
||||||
|
|
||||||
@@ -34,17 +34,34 @@ class MainWindow(QMainWindow):
|
|||||||
self.setWindowTitle(f"听泉Cursor助手 v{version} (本机Cursor版本: {cursor_version})")
|
self.setWindowTitle(f"听泉Cursor助手 v{version} (本机Cursor版本: {cursor_version})")
|
||||||
self.setMinimumSize(600, 500)
|
self.setMinimumSize(600, 500)
|
||||||
|
|
||||||
# 设置图标
|
# 设置窗口图标
|
||||||
try:
|
icon_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "icon", "two.ico")
|
||||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
if os.path.exists(icon_path):
|
||||||
icon_path = os.path.join(os.path.dirname(current_dir), "icon", "th.jpg")
|
window_icon = QIcon(icon_path)
|
||||||
if os.path.exists(icon_path):
|
if not window_icon.isNull():
|
||||||
self.setWindowIcon(QIcon(icon_path))
|
self.setWindowIcon(window_icon)
|
||||||
logging.info(f"成功加载图标: {icon_path}")
|
logging.info(f"成功设置窗口图标: {icon_path}")
|
||||||
else:
|
|
||||||
logging.error(f"图标文件不存在: {icon_path}")
|
# 创建系统托盘图标
|
||||||
except Exception as e:
|
self.tray_icon = QSystemTrayIcon(self)
|
||||||
logging.error(f"设置图标失败: {str(e)}")
|
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()
|
||||||
|
|
||||||
# 创建主窗口部件
|
# 创建主窗口部件
|
||||||
central_widget = QWidget()
|
central_widget = QWidget()
|
||||||
@@ -107,6 +124,26 @@ class MainWindow(QMainWindow):
|
|||||||
# 启动时检查一次状态
|
# 启动时检查一次状态
|
||||||
QTimer.singleShot(0, self.check_status)
|
QTimer.singleShot(0, self.check_status)
|
||||||
|
|
||||||
|
def on_tray_icon_activated(self, reason):
|
||||||
|
"""处理托盘图标的点击事件"""
|
||||||
|
if reason == QSystemTrayIcon.DoubleClick:
|
||||||
|
self.show()
|
||||||
|
self.activateWindow()
|
||||||
|
|
||||||
|
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:
|
||||||
|
event.accept()
|
||||||
|
|
||||||
def copy_device_id(self):
|
def copy_device_id(self):
|
||||||
"""复制设备ID到剪贴板"""
|
"""复制设备ID到剪贴板"""
|
||||||
if not self.check_status():
|
if not self.check_status():
|
||||||
|
|||||||
BIN
icon/logo1.ico
Normal file
BIN
icon/logo1.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
BIN
icon/logo2.ico
Normal file
BIN
icon/logo2.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
BIN
icon/logo3.ico
Normal file
BIN
icon/logo3.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
29
main.py
29
main.py
@@ -6,7 +6,9 @@ import atexit
|
|||||||
import shutil
|
import shutil
|
||||||
import tempfile
|
import tempfile
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from PyQt5.QtWidgets import QApplication, QMessageBox
|
from PyQt5.QtWidgets import QApplication, QMessageBox, QSystemTrayIcon, QMenu
|
||||||
|
from PyQt5.QtGui import QIcon
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
from gui.main_window import MainWindow
|
from gui.main_window import MainWindow
|
||||||
|
|
||||||
def cleanup_temp():
|
def cleanup_temp():
|
||||||
@@ -65,7 +67,32 @@ def main():
|
|||||||
|
|
||||||
logging.info("正在初始化主窗口...")
|
logging.info("正在初始化主窗口...")
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
|
# 设置应用程序ID (在设置图标之前)
|
||||||
|
if sys.platform == "win32":
|
||||||
|
import ctypes
|
||||||
|
myappid = u'nezha.cursor.helper.v3'
|
||||||
|
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
|
||||||
|
logging.info(f"设置应用程序ID: {myappid}")
|
||||||
|
|
||||||
|
# 设置应用程序图标
|
||||||
|
try:
|
||||||
|
icon_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "icon", "two.ico")
|
||||||
|
if os.path.exists(icon_path):
|
||||||
|
app_icon = QIcon(icon_path)
|
||||||
|
if not app_icon.isNull():
|
||||||
|
app.setWindowIcon(app_icon)
|
||||||
|
logging.info(f"成功设置应用程序图标: {icon_path}")
|
||||||
|
else:
|
||||||
|
logging.error("图标文件加载失败")
|
||||||
|
else:
|
||||||
|
logging.error(f"图标文件不存在: {icon_path}")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"设置应用程序图标失败: {str(e)}")
|
||||||
|
|
||||||
window = MainWindow()
|
window = MainWindow()
|
||||||
|
window.setWindowIcon(app.windowIcon()) # 确保窗口使用相同的图标
|
||||||
|
|
||||||
logging.info("正在启动主窗口...")
|
logging.info("正在启动主窗口...")
|
||||||
window.show()
|
window.show()
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
|
# Use Tsinghua mirror for faster download in China:
|
||||||
|
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
|
||||||
|
|
||||||
requests==2.31.0
|
requests==2.31.0
|
||||||
pyinstaller==6.3.0
|
pyinstaller==6.3.0
|
||||||
pillow==10.2.0 # 用于处理图标
|
pillow==10.2.0 # For icon processing
|
||||||
setuptools==65.5.1 # 解决pkg_resources.extern问题
|
setuptools==65.5.1 # Fix pkg_resources.extern issue
|
||||||
|
PyQt5==5.15.10 # GUI framework
|
||||||
|
pywin32==306 # Windows API support
|
||||||
@@ -1 +1 @@
|
|||||||
3.2.8
|
3.3.1
|
||||||
Reference in New Issue
Block a user