在Python GUI中将数据传递到QThread

在Python GUI中将数据传递到QThread,python,qt,user-interface,qthread,Python,Qt,User Interface,Qthread,我试图将一些参数(循环迭代次数、计数器值等)传递到QtGUI线程中的run方法中 当我尝试向run方法传递一个值时,除了线程、信号和插槽之外,所有的东西都工作得很好。当我传入整数值(例如100)时,run方法出现错误。当打印run方法的值时,输出是一个对象内存地址,例如 我该怎么解决这个问题 提前谢谢你的帮助 下面是Python代码的示例: #class testThread(QtCore.QThread): def __init__(self,val, parent=None):

我试图将一些参数(循环迭代次数、计数器值等)传递到QtGUI线程中的run方法中

当我尝试向run方法传递一个值时,除了线程、信号和插槽之外,所有的东西都工作得很好。当我传入整数值(例如100)时,run方法出现错误。当打印run方法的值时,输出是一个对象内存地址,例如

我该怎么解决这个问题

提前谢谢你的帮助

下面是Python代码的示例:

#class testThread(QtCore.QThread):
    def __init__(self,val, parent=None):
        QtCore.QThread.__init__(self)
        self.pulseTime = 0.002
        self.counter = 0
        self.icount = 0
        self.timeout = 4
        self.default = 99
        self.val = val
        print self.val
    def run(self):
        self.timer = QtCore.QTimer()
        self.timer.setInterval(1000)
        self.timer.setSingleShot(False)
        self.timer.start()
        self.timer.timeout.connect(self.update_mode)
        self.exec_()

    def update_mode(self):
        self.counter += self.val
        self.emit(QtCore.SIGNAL("int"),self.counter)

    def stop(self):
        self.terminate()

class Main(QtGui.QMainWindow):

    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.ui = Ui_Main()
        self.ui.setupUi(self)
        self._active = False
        self.val = 100

        self.setupSignals()

    def spinBox_Value(self):
        self.val = self.ui.spinBox.value()

    def startPressed(self):
        self.testThreadCall.start()

        if not self._active:
            self._active = True
            self.ui.pButton_StartStop.setText("Stop")

        else:
            self._active = False
            self.testThreadCall.stop()

        print self._active


    def setupSignals(self):

        print "Val", self.val
        self.testThreadCall = testThread(self, self.val)
        self.testThreadCall.setTerminationEnabled(True)

        QtCore.QObject.connect(self.testThreadCall, QtCore.SIGNAL("int"),self.labelSet)

        self.ui.dopDown.addItems(['Default','Second Set','Third Set'])
        self.ui.dopDown.currentIndexChanged.connect(self.dropDownEvent)

        self.ui.pButton_StartStop.clicked.connect(self.startPressed)

        self.ui.spinBox.valueChanged.connect(self.spinBox_Value)

    def closeEvent(self, event):
        self.testThreadCall.quit()

###if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Main()
    window.show()

    sys.exit(app.exec_())

testThread
定义为:

class testThread(QtCore.QThread):
    def __init__(self, val, parent=None):
        ...
稍后,您将创建一个
testThread
的实例,如下所示:

self.testThreadCall = testThread(self, self.val)

因此,
testThread.val
被设置为
self
(=主窗口),而
testThread.parent
被设置为
self.val
。将
(self,self.val)
替换为
(self.val,self)
应该可以解决您的问题。

谢谢您的帮助。。。一切似乎都很正常,除了运行testThread时,它只继承了我在main中定义的self.val的初始值。当我更改spinBox值时,它是self.val=self.ui.spinBox.Value(),它似乎不会继承该更改。。。你们知道为什么会发生这种情况吗?还有,你们对编程方法有什么看法?有没有其他办法使它更精简。提前谢谢!当您创建线程时,它在
val
的副本上(您可以
self.val=val
Main.val
testThread.val
是两个不同的对象。对于使用线程编程,我建议阅读。我将其移植到python,您可以在注释中找到链接