python - PySide2 QMainWindow() 在 PyInstaller 中捆绑后无法渲染
问题描述
我正在尝试将 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)
我发现了以下内容:
此外,我已经在 PyQt5 下对此进行了测试(并为 QApplication() 提供了一组空的参数,app = QApplication([])
因为需要 > 0 个参数。这是成功的;按预期构建了一个 UI。我还提供了 PySide2 的 QApplication使用 sys.argv,但没有生成 UI。
但是,上面链接中列出的修复程序表明要添加到系统环境中。由于我只遇到 dist 可执行文件的问题,因此我不确定如何继续将其放入可分发文件中;我可以插入的 .spec 是否有更改以在我将安装它的机器上设置环境变量?我完全错过了什么吗?这只是 Big Sur 库参考问题的另一个产物(如那些链接中所述)吗?
解决方案
发布后,我决定再试一次。通过此响应:https ://stackoverflow.com/a/64847505/12026170
我将 _tkinter 导入到项目中包含 QApplication() 类的模块中。然后,通过 PyInstaller(带有 --onefile 标志)生成应用程序包就可以了。我不是 100% 知道为什么这是一种解决方法,但确实如此。
推荐阅读
- php - 为什么自定义 Woocommerce 端点需要多次永久链接重置?
- visual-studio - Visual Studions Build Events 中 Use in Build 选项的含义
- python - 如何使用 Python 本身而不是通过鼠标单击来控制复选框?
- python - Python 列表连接逻辑
- javascript - 如何将数据传递给普通的 CSS/JS 模态
- excel - Power Query 在条件下更改单元格中的值
- ruby-on-rails - 从今天开始的 3 天 b/w 目前仅计算今天的两个日期轨道
- corda - 尝试运行基本的 cordapp-example 时卡在 deployNodes
- google-cloud-dlp - Google DLP 中的文本字典转换
- aws-lambda - 如何将 CloudWatch Lambda Insights 添加到无服务器配置?