QDialog Window 退出 PyInstaller 冻结程序后神秘启动
QDialog Window Mysteriously Launches After Exiting PyInstaller Frozen Program
PyQt5 QDialog window 在我冻结的 Python 3.8 脚本退出后神秘地自动启动。
我有两个不同的应用程序(ProgA 和 ProgB)是通过冻结 Python 脚本创建的。它们的相似之处在于它们都有 PyQt5 GUI 界面,都使用 OpenCV 合并视频,都有类似的 QDialog windows 用于用户配置,并且都在 Windows 10 平台上 运行。每个应用程序都有多个 Python 模块,每个模块都已被 PyInstaller 和 cx_Freeze.
冻结
ProgA 运行s 并在 IDE 中执行或在使用 PyInstaller 或 cx_Freeze.
冻结它后毫无问题地退出
ProgB 运行s 并在 IDE 内或在 cx_Freeze 冻结后没有任何问题退出。 ProgB 在使用 PyInstaller 冻结后也 运行 正常,但在退出时出现一些奇怪的事情——启动了一个包含用户配置的 QDialog window。
这个对话框window包含几个单选按钮和QLineEdit对象。在主 window 退出后启动时,window 与在 Qt Designer 中创建的完全一样——它包含默认的单选按钮复选标记,就好像它被重置了一样——它有 none用户配置首选项。因此,未读取配置文件。
我创建了一个与 ProgB 完全一样退出程序的最小示例,但最小示例没有重现问题。
我还在单击主要 window 退出按钮后的每个语句之间放置了打印语句,然后是 2 秒的睡眠(这样我可以跟随执行)。 ProbB 在启动对话框 window 之前执行最后一条语句 QtCore.QCoreApplication.quit()
。
这是我在 PyInstaller 中使用的规范文件。
block_cipher = None
a = Analysis(['ProgB.py','CustomCombo.py','Config.py','Layout.py'],
pathex=['c:\Users\slalo\Documents\VTMBuild'],
binaries=[],
datas=[('Icon.ico','.'),
('IconSmall.ico','.'),
('License.txt','.'),
('Manual.htm','.'),
('Manual_files','Manual_files')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='ProgB',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='ProgB')
我已经束手无策了。我找不到 QDialog window 在退出 ProgB 后神秘出现的任何原因。有什么建议吗?
当 PyInstaller 打包冻结基线时,Analysis
列表中的任何脚本都被视为主要脚本。支持文件(CustomCombo.py
、Config.py
和 Layout.py
)应包含在 datas
列表而不是 Analysis
列表中。这解决了我的问题。
PyQt5 QDialog window 在我冻结的 Python 3.8 脚本退出后神秘地自动启动。
我有两个不同的应用程序(ProgA 和 ProgB)是通过冻结 Python 脚本创建的。它们的相似之处在于它们都有 PyQt5 GUI 界面,都使用 OpenCV 合并视频,都有类似的 QDialog windows 用于用户配置,并且都在 Windows 10 平台上 运行。每个应用程序都有多个 Python 模块,每个模块都已被 PyInstaller 和 cx_Freeze.
冻结ProgA 运行s 并在 IDE 中执行或在使用 PyInstaller 或 cx_Freeze.
冻结它后毫无问题地退出ProgB 运行s 并在 IDE 内或在 cx_Freeze 冻结后没有任何问题退出。 ProgB 在使用 PyInstaller 冻结后也 运行 正常,但在退出时出现一些奇怪的事情——启动了一个包含用户配置的 QDialog window。
这个对话框window包含几个单选按钮和QLineEdit对象。在主 window 退出后启动时,window 与在 Qt Designer 中创建的完全一样——它包含默认的单选按钮复选标记,就好像它被重置了一样——它有 none用户配置首选项。因此,未读取配置文件。
我创建了一个与 ProgB 完全一样退出程序的最小示例,但最小示例没有重现问题。
我还在单击主要 window 退出按钮后的每个语句之间放置了打印语句,然后是 2 秒的睡眠(这样我可以跟随执行)。 ProbB 在启动对话框 window 之前执行最后一条语句 QtCore.QCoreApplication.quit()
。
这是我在 PyInstaller 中使用的规范文件。
block_cipher = None
a = Analysis(['ProgB.py','CustomCombo.py','Config.py','Layout.py'],
pathex=['c:\Users\slalo\Documents\VTMBuild'],
binaries=[],
datas=[('Icon.ico','.'),
('IconSmall.ico','.'),
('License.txt','.'),
('Manual.htm','.'),
('Manual_files','Manual_files')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='ProgB',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True)
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='ProgB')
我已经束手无策了。我找不到 QDialog window 在退出 ProgB 后神秘出现的任何原因。有什么建议吗?
当 PyInstaller 打包冻结基线时,Analysis
列表中的任何脚本都被视为主要脚本。支持文件(CustomCombo.py
、Config.py
和 Layout.py
)应包含在 datas
列表而不是 Analysis
列表中。这解决了我的问题。