首页 > 解决方案 > 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 库参考问题的另一个产物(如那些链接中所述)吗?

标签: pythonpython-3.xpyinstallerpyside2macos-big-sur

解决方案


发布后,我决定再试一次。通过此响应:https ://stackoverflow.com/a/64847505/12026170

我将 _tkinter 导入到项目中包含 QApplication() 类的模块中。然后,通过 PyInstaller(带有 --onefile 标志)生成应用程序包就可以了。我不是 100% 知道为什么这是一种解决方法,但确实如此。


推荐阅读