From ec94f2e04bb668291fc7621c0141a81f80265571 Mon Sep 17 00:00:00 2001 From: flavioy Date: Thu, 9 Apr 2026 22:08:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0PyInstaller=20macOS=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=94=AF=E6=8C=81=EF=BC=9A=E8=B5=84=E6=BA=90=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E5=A4=84=E7=90=86=E3=80=81multiprocessing=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E3=80=81=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E5=A4=96?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.6 --- backend/config.py | 9 ++++++++- backend/main.py | 1 + gui.py | 11 ++++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/backend/config.py b/backend/config.py index 091ab9e..ea678c0 100644 --- a/backend/config.py +++ b/backend/config.py @@ -1,5 +1,6 @@ import os +import sys from pathlib import Path from qfluentwidgets import (qconfig, ConfigItem, QConfig, OptionsValidator, BoolValidator, OptionsConfigItem, EnumSerializer, RangeValidator, RangeConfigItem, ConfigValidator) @@ -101,7 +102,13 @@ class Config(QConfig): # 视频保存目录 saveDirectory = ConfigItem("Main", "SaveDirectory", "", ConfigValidator()) -CONFIG_FILE = 'config/config.json' +# PyInstaller 打包后配置文件写入 .app bundle 同级目录(避免修改签名) +if getattr(sys, 'frozen', False): + # sys.executable -> Contents/MacOS/VideoSubtitleRemover, 向上3级到 .app 所在目录 + _app_dir = os.path.dirname(os.path.dirname(os.path.dirname(sys.executable))) + CONFIG_FILE = os.path.join(_app_dir, 'config', 'config.json') +else: + CONFIG_FILE = 'config/config.json' config = Config() qconfig.load(CONFIG_FILE, config) diff --git a/backend/main.py b/backend/main.py index b067f1c..d11df57 100644 --- a/backend/main.py +++ b/backend/main.py @@ -379,6 +379,7 @@ class SubtitleRemover: if __name__ == '__main__': + multiprocessing.freeze_support() multiprocessing.set_start_method("spawn") from backend.tools.args_handler import parse_args args = parse_args() diff --git a/gui.py b/gui.py index fffb63a..7a4714f 100644 --- a/gui.py +++ b/gui.py @@ -8,6 +8,14 @@ import sys import os + +# PyInstaller 打包后资源路径处理 +def resource_path(relative_path): + """获取资源文件的绝对路径(兼容 PyInstaller 打包)""" + if getattr(sys, 'frozen', False): + return os.path.join(sys._MEIPASS, relative_path) + return os.path.join(os.path.abspath(os.path.dirname(__file__)), relative_path) + import configparser import cv2 import multiprocessing @@ -42,7 +50,7 @@ class SubtitleExtractorGUI(FluentWindow): # self.themeListener.start() # 设置窗口图标 - self.setWindowIcon(QtGui.QIcon("design/vsr.ico")) + self.setWindowIcon(QtGui.QIcon(resource_path("design/vsr.ico"))) self.setWindowTitle(tr['SubtitleExtractorGUI']['Title'] + " v" + VERSION) # 创建界面布局 self._create_layout() @@ -162,6 +170,7 @@ class SubtitleExtractorGUI(FluentWindow): if __name__ == '__main__': + multiprocessing.freeze_support() multiprocessing.set_start_method("spawn") QApplication.setHighDpiScaleFactorRoundingPolicy( Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)