使用 py2app 构建 PySide 应用程序包时,QApplication 未在主线程中运行

Posted

技术标签:

【中文标题】使用 py2app 构建 PySide 应用程序包时,QApplication 未在主线程中运行【英文标题】:QApplication is not running in main thread when building PySide app bundle with py2app 【发布时间】:2013-05-06 00:42:49 【问题描述】:

我在使用 py2app(对于 OS X)构建我的 PySide Python 应用程序时遇到问题。 app bundle 上的线程似乎发生了一些有趣的事情。

这是最简单的例子

from PySide.QtCore import *
from PySide.QtGui import *
import sys

class App(QApplication):
    def __init__(self):
        QApplication.__init__(self, sys.argv, True)

        self.timer = QTimer(self)


if __name__=='__main__':
    app = App()
    app.exec_()

当从命令行运行时:python test.py,这可以正常工作而不会出错。但是,当我使用以下 setup.py 编译它时:

from setuptools import setup
import py2app
import PySide

APP = ['test.py']
DATA_FILES = []
OPTIONS = 'argv_emulation': False,
            'includes' : 'PySide',
            'resources' : "qt_menu.nib"
            

setup(
    app=APP,
    data_files=DATA_FILES,
    options='py2app': OPTIONS,
    setup_requires=['py2app'],
)

这些错误出现在控制台中:

11/05/2013 13:54:20.958 [0x0-0xb37b37].org.pythonmac.unspecified.test: QObject: Cannot create children for a parent that is in a different thread.
11/05/2013 13:54:20.958 [0x0-0xb37b37].org.pythonmac.unspecified.test: (Parent is App(0x105f41f10), parent's thread is QThread(0x100106cc0), current thread is QThread(0x10251ea80)

所以看起来 App 不再被构造为生活在主线程中。任何想法如何解决这个问题?

【问题讨论】:

无论如何,我无法使用 PyQt4 重现您的问题(Qt-4.8.3、PyQt-4.9.5、OSX-10.7、Python-2.7.3、py2app-0.7.3 )。也许这个问题只影响 PySide 用户? 这很奇怪。 Py2app 不会在应用程序包中创建线程。 顺便说一句。您不必在 setup.py 文件中导入 Pyside。 谢谢 - 这很奇怪。值得一提的是,我正在使用 MacPorts。我有一种预感,这个问题可能涉及一个已经为 Python 3 和 Python 2 安装的依赖项,尽管错误消息中没有太多支持它。 是的,在朋友的 MacPorts 设置上编译没有这个问题 - 我的设置一定有什么有趣的地方。 【参考方案1】:

问题似乎是 PySide 管理 QThreads 的方式。你正在创建一个QTimer,并以QApplication 作为父级。使用PyQt4 时这不是问题,但它可能在 PySide 上。

QTimer 也会生成 QThread,因此请尝试在不创建 QTimer 的情况下运行您的代码。

注意:在您提出问题时,这可能是一个错误。并且可能在 PySide 的最新版本中得到修复。 (我只是推测:D)

【讨论】:

以上是关于使用 py2app 构建 PySide 应用程序包时,QApplication 未在主线程中运行的主要内容,如果未能解决你的问题,请参考以下文章

Py2App - PyQt5 使用错误的 port_v#

Py2App 错误——功能未实现

如何打包 PySide2 应用程序以进行分发?

使用 cx-freeze 构建 PySide 程序 osx 的奇怪错误

如何从具有 PySide2 GUI 的 python 脚本构建一个 mac os 应用程序?

我在 Pycharm 中使用 PySide2 来构建我的 GUI 程序,但是在哪里可以找到参考文档?