diff --git a/oneketdiag.spec b/onekeydiag.spec similarity index 65% rename from oneketdiag.spec rename to onekeydiag.spec index 6bc1b42..c8eda5c 100644 --- a/oneketdiag.spec +++ b/onekeydiag.spec @@ -1,47 +1,66 @@ -# -*- mode: python ; coding: utf-8 -*- - -block_cipher = None - -# 定义所有需要打包的文件和依赖 -a = Analysis( - ['./src/main.py'], # 程序入口文件 - pathex=['./'], # 工程根目录(确保能找到子模块) - binaries=[], - # 配置资源文件(子模块会自动识别,主要配置非.py文件) - datas=[ - # 若有其他资源(如.ui文件、图片等),按此格式添加 - ], - # 隐藏依赖(若打包后提示缺少模块,添加在这里) - hiddenimports=[ - ], - hookspath=[], - hooksconfig={}, - runtime_hooks=[], - excludes=[], # 排除不需要的模块(减小体积) - noarchive=False, - cipher=block_cipher, -) - -pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) - -exe = EXE( - pyz, - a.scripts, - a.binaries, - a.zipfiles, - a.datas, - name='OneKeyDiag', # 生成的EXE文件名 - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=True, # 启用压缩(推荐) - upx_exclude=[], - runtime_tmpdir=None, - console=False, # 隐藏控制台(GUI程序) - disable_windowed_traceback=False, - argv_emulation=False, - target_arch=None, - codesign_identity=None, - entitlements_file=None, -) +# -*- mode: python ; coding: utf-8 -*- +import os +import sys +from PyInstaller.utils.hooks import collect_data_files + +block_cipher = None +# 获取spec文件所在目录(项目根目录) +spec_dir = os.path.dirname(os.path.abspath(sys.argv[0])) + +# 定义需要打包的资源文件 +resource_files = [ + # 将resource文件夹下的所有文件打包到程序内的resource目录 + (os.path.join(spec_dir, 'resource'), 'resource') +] + +# 收集PyQt相关的数据文件 +qt_data = collect_data_files('PyQt5') + +# 合并所有资源文件 +all_resources = resource_files + qt_data + +# 定义所有需要打包的文件和依赖 +a = Analysis( + ['./src/main.py'], # 程序入口文件 + pathex=['./'], # 工程根目录(确保能找到子模块) + binaries=[], + # 配置资源文件(子模块会自动识别,主要配置非.py文件) + datas=[ + # 若有其他资源(如.ui文件、图片等),按此格式添加 + ], + # 隐藏依赖(若打包后提示缺少模块,添加在这里) + hiddenimports=[ + ], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], # 排除不需要的模块(减小体积) + noarchive=False, + cipher=block_cipher, +) + +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='OneKeyDiag', # 生成的EXE文件名 + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, # 启用压缩(推荐) + upx_exclude=[], + runtime_tmpdir=None, + console=False, # 隐藏控制台(GUI程序) + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + # 指定程序图标(使用resources文件夹中的ico文件) + icon=os.path.join(spec_dir, 'resource','favicon.ico'), +) \ No newline at end of file diff --git a/resource/favicon.ico b/resource/favicon.ico new file mode 100644 index 0000000..c83210e Binary files /dev/null and b/resource/favicon.ico differ diff --git a/resource/favicon/android-chrome-192x192.png b/resource/favicon/android-chrome-192x192.png new file mode 100644 index 0000000..3ef31ae Binary files /dev/null and b/resource/favicon/android-chrome-192x192.png differ diff --git a/resource/favicon/android-chrome-512x512.png b/resource/favicon/android-chrome-512x512.png new file mode 100644 index 0000000..259efe4 Binary files /dev/null and b/resource/favicon/android-chrome-512x512.png differ diff --git a/resource/favicon/apple-touch-icon.png b/resource/favicon/apple-touch-icon.png new file mode 100644 index 0000000..d448a57 Binary files /dev/null and b/resource/favicon/apple-touch-icon.png differ diff --git a/resource/favicon/favicon-16x16.png b/resource/favicon/favicon-16x16.png new file mode 100644 index 0000000..6b8af6b Binary files /dev/null and b/resource/favicon/favicon-16x16.png differ diff --git a/resource/favicon/favicon-32x32.png b/resource/favicon/favicon-32x32.png new file mode 100644 index 0000000..8877a0e Binary files /dev/null and b/resource/favicon/favicon-32x32.png differ diff --git a/resource/favicon/favicon-48x48.png b/resource/favicon/favicon-48x48.png new file mode 100644 index 0000000..407f163 Binary files /dev/null and b/resource/favicon/favicon-48x48.png differ diff --git a/resource/favicon/site.webmanifest b/resource/favicon/site.webmanifest new file mode 100644 index 0000000..901bd0c --- /dev/null +++ b/resource/favicon/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/src/main.py b/src/main.py index 6d8da70..7011bc6 100644 --- a/src/main.py +++ b/src/main.py @@ -1,13 +1,30 @@ +import os import sys import service from PyQt5.QtWidgets import QApplication +from PyQt5.QtGui import QIcon from main_window import MainWindow # 导入重构后的主窗口类 if __name__ == "__main__": + # Windows系统特定设置,确保任务栏图标正确显示 + try: + from ctypes import windll + myappid = 'marcin.ZiJin.onekeydiag.1.0' # 自定义唯一ID + windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) + except ImportError: + pass # 非Windows系统忽略 + # 初始化服务缓存 service.app_cache_init() # 创建PyQt应用实例 app = QApplication(sys.argv) + # 获取文件系统中存放的icon + icon_path = service.get_icon_path() + if os.path.exists(icon_path): + app.setWindowIcon(QIcon(icon_path)) + else: + print("not found favicon") + # 初始化并显示主窗口 window = MainWindow() window.show() diff --git a/src/service.py b/src/service.py index f1e645d..8cc44be 100644 --- a/src/service.py +++ b/src/service.py @@ -43,7 +43,17 @@ def app_cache_init(): utils.clean_log_data(cache_dir) os.mkdir(cache_dir) - pass + +def get_icon_path(): + """获取资源文件的绝对路径""" + try: + # 打包后的环境 + base_path = sys._MEIPASS + except AttributeError: + # 开发环境: + base_path = utils.get_project_root() + resource_dir = os.path.join(base_path, "resource") + return os.path.join(resource_dir, "favicon.ico") def send_log_to_cache(filepath): project_root = utils.get_project_root() diff --git a/src/timelineEvent.py b/src/timelineEvent.py index a66a070..54db62e 100644 --- a/src/timelineEvent.py +++ b/src/timelineEvent.py @@ -5,7 +5,8 @@ from PyQt5.QtWidgets import (QApplication, QWidget, QGraphicsView, QGraphicsScen QGraphicsTextItem, QToolTip, QVBoxLayout, QTabWidget, QLabel) from PyQt5.QtCore import Qt, QEvent, QTimer, QPoint -from PyQt5.QtGui import QPen, QBrush, QColor, QFont, QPainter +from PyQt5.QtGui import QPen, QBrush, QColor, QFont, QPainter, QIcon +import service class TimelineEvent: """事件数据封装类""" @@ -312,6 +313,10 @@ class TimelineTabContent(QWidget): self.init_ui() def init_ui(self): + # 设置窗口图标 + icon_path = service.get_icon_path() + self.setWindowIcon(QIcon(icon_path)) + layout = QVBoxLayout(self) title_label = QLabel("事件时间线")