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

Tim*_* MB 5 python multithreading pyqt py2app pyside

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

这是最小的例子

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_()
Run Code Online (Sandbox Code Playgroud)

从命令行运行: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'],
)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

所以似乎App不再被构建为继续存在于主线程中.任何想法如何解决这一问题?

Ray*_*nda 0

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

AQTimer也会生成一个QThreadso,请尝试运行您的代码而不创建QTimer.

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