【发布时间】:2020-11-13 19:58:45
【问题描述】:
一个 PyQt5 QDialog 窗口在我冻结的 Python 3.8 脚本退出后神秘地自动启动。
我有两个通过冻结 Python 脚本创建的不同应用程序(ProgA 和 ProgB)。它们的相似之处在于它们都具有 PyQt5 GUI 界面,都使用 OpenCV 合并视频,都具有用于用户配置的相似 QDialog 窗口,并且都在 Windows 10 平台上运行。每个应用程序都有多个 Python 模块,每个模块都被 PyInstaller 和 cx_Freeze 冻结。
在 IDE 中执行或使用 PyInstaller 或 cx_Freeze 冻结 ProgA 时,ProgA 运行和退出没有任何问题。
ProgB 在 IDE 内或使用 cx_Freeze 冻结后运行和退出时没有任何问题。使用 PyInstaller 冻结后 ProgB 也可以正常运行但退出时出现一些奇怪的情况 - 启动了一个包含用户配置的 QDialog 窗口。
这个对话框窗口包含几个单选按钮和 QLineEdit 对象。在主窗口退出后启动时,该窗口与在 Qt Designer 中创建的完全一样——它包含默认的单选按钮复选标记,就像它被重置一样——它没有任何用户配置首选项。因此,配置文件没有被读取。
我创建了一个与 ProgB 完全一样退出程序的最小示例,但最小示例不会重现问题。
在单击主窗口退出按钮后,我还在每个语句之间放置了打印语句,然后是 2 秒的睡眠(这样我可以跟随执行)。 ProbB 在启动对话窗口之前执行最后一条语句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')
我束手无策。我找不到退出 ProgB 后 QDialog 窗口神秘出现的任何原因。有什么建议吗?
【问题讨论】:
标签: python python-3.x pyqt pyqt5 pyinstaller