PySide2 QMainWindow()捆绑在PyInstaller中后无法呈现[重复]
Posted
技术标签:
【中文标题】PySide2 QMainWindow()捆绑在PyInstaller中后无法呈现[重复]【英文标题】:PySide2 QMainWindow() fails to render after bundled within PyInstaller [duplicate] 【发布时间】:2021-02-01 18:58:41 【问题描述】:我正在尝试将 Python(在 PyCharm 中的 venv 中为 3.8)打包为可分发的 macOS .app 包。我之前在 macOS Catalina 下使用 Tkinter 完成过此操作,但是这个项目是在 PySide2 (5.15.2) 中并在 M1 芯片上的 Big Sur 11.1 下开发的。
MRE(在我的环境中保存为 main.py):
from PySide2.QtWidgets import QApplication, QMainWindow, QLabel
app = QApplication()
window = QMainWindow()
label = QLabel('foo')
window.setCentralWidget(label)
window.show()
app.exec_()
从 PyCharm 运行它会按预期正确呈现窗口。但是,在通过 PyInstaller 打包后,执行 .py(来自 /dist 文件夹)或创建的 .app 包都无法呈现任何 UI。看起来应用程序已正确启动,因为它出现在 Dock 中,并且进程在 Activity Monitor 中没有响应(CPU 使用率约为 98%)。没有错误打印到控制台,也没有在任何地方注明。
Pyinstaller 命令相当基本:pyinstaller --windowed main.py
以及生成的 .spec:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=['/Users/ben/PycharmProjects/pythonProject'],
binaries=[],
datas=[],
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='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='main')
app = BUNDLE(coll,
name='main.app',
icon=None,
bundle_identifier=None)
我发现了以下内容:
https://forums.macrumors.com/threads/pyqt5-and-big-sur.2260773/ Apps not popping up on macOS Big Sur 11.0.1此外,我已经在 PyQt5 下对此进行了测试(并为 QApplication() 提供了一组空的 args,app = QApplication([])
,因为需要 > 0 个 args。这是成功的;按预期构建了一个 UI。我'还为 PySide2 的 QApplication 提供了 sys.argv,但没有生成 UI。
但是,上面链接中列出的修复程序表示要添加到系统环境中。由于我只遇到 dist 可执行文件的问题,因此我不确定如何继续将其放入可分发文件中;我可以插入的 .spec 是否有更改以在我将安装它的机器上设置环境变量?我完全错过了什么吗?这只是 Big Sur 库参考问题的另一个产物(如这些链接中所述)吗?
【问题讨论】:
【参考方案1】:发布后,我决定再试一次。通过此回复:https://***.com/a/64847505/12026170
我将 _tkinter 导入到项目中包含 QApplication() 类的模块中。然后,通过 PyInstaller(带有 --onefile 标志)生成应用程序包就可以了。我不是 100% 知道为什么这是一种解决方法,但确实如此。
【讨论】:
以上是关于PySide2 QMainWindow()捆绑在PyInstaller中后无法呈现[重复]的主要内容,如果未能解决你的问题,请参考以下文章