在具有对象

时间:2016-06-09 22:30:45

标签: python multithreading pyside

我遇到了一个无法找到答案的问题。

我正在开发一个用Python开发的GUI应用程序及其UI库:PySide2(用于Python的Qt包装器)

我有一个繁重的计算功能,我想放在另一个线程上,以便不冻结我的UI。 Ui应该显示“正在加载”,当功能结束时,从中接收结果并用它更新UI。

我尝试过很多不同的代码,很多例子都适用于其他人而不是我,是PySide2的错吗? (例如,这几乎就是我想做的事:Updating GUI elements in MultiThreaded PyQT

我的代码是:

class OtherThread(QThread):

    def __init__(self):
        QThread.__init__(self)

    def run(self):
        print 'Running......'
        self.emit(SIGNAL("over(object)"), [(1,2,3), (2,3,4)])

@Slot(object)
def printHey( obj):
    print 'Hey, I\'ve got an object ',
    print obj

thr = OtherThread()
self.connect(thr,SIGNAL("over(object)"),printHey)
thr.start()

如果我使用boolint之类的原语而不使用对象,我的代码正常工作。我看到'跑步......',但从未见过。

希望有人能够启发我

1 个答案:

答案 0 :(得分:2)

您无法在类实例上动态定义信号。它们必须被定义为类属性。您应该使用new-style signals and slot syntax

class OtherThread(QThread):
    over = QtCore.Signal(object)

    def run(self):
        ...
        self.over.emit([(1,2,3), (2,3,4)])


class MyApp(QtCore.QObject)

    def __init__(self):
        super(MyApp, self).__init__()
        self.thread = OtherThread(self)
        self.thread.over.connect(self.on_over)
        self.thread.start()

    @QtCore.Slot(object)
    def on_over(self, value):
        print 'Thread Value', value