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中后无法呈现[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pyside2如何打开对话框但并不总是在顶部

《Nuitka打包实战指南》实战打包PySide2

PySide2 与 Pyqt5 的区别

pyside2-uic 工具把ui文件转化为python类

PySide2(PyQt5)根据屏幕大小初始化窗口大小

PySide2(PyQt5) 实现tab切换及方法详解(不定时更新)