PyQt线程属性错误

时间:2017-04-13 00:05:16

标签: python multithreading pyqt qthread

我是PyQt的新手,我只是想做QThreading。 但是我收到了错误:AttributeError:' myThread'对象没有属性' ui'

我的代码:

from time import sleep

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from takipSistemi import Ui_MainWindow



class anaPencere(QMainWindow):
    def __init__(self):
        QWidget.__init__(self)
        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)
        self.thread = myThread()
        self.ui.tableWidget.setItem(0,  0, QTableWidgetItem("hi!"))
        self.thread.start()    

class myThread(QThread):
    def __init__(self,parent=None):
        QThread.__init__(self,parent)
        self.exiting = False

    def __del__(self):
        self.exiting = True
        self.wait()

    def run(self):
        #error
        self.ui.tableWidget.setItem(0 , 0, QTableWidgetItem('hi there!'))

uyg=QApplication([])
pencere=anaPencere()
pencere.show()
uyg.exec_()

如何将ui归因于myThread?

1 个答案:

答案 0 :(得分:0)

anaPenceremyThread这两个类中,只有第一个分配了属性self.ui = ...。由于myThread没有属性ui,因此您在调用self.ui.tableWidget...时会收到错误。

要解决此问题,您有几种选择。一种方法是将类anaPencere的引用传递给它的线程类:

class anaPencere(QMainWindow):

    def __init__(self):
        QWidget.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.thread = myThread(self)
        self.ui.tableWidget.setItem(0,  0, QTableWidgetItem("hi!"))
        self.thread.start()


class myThread(QThread):

    def __init__(self,parent=None):
        QThread.__init__(self, parent)
        self.exiting = False

    def __del__(self):
        self.exiting = True
        self.wait()

    def run(self):
        self.parent().ui.tableWidget.setItem(0 , 0, QTableWidgetItem('hi there!'))

如果采用此方法(使用anaPencere作为parent的{​​{1}}),您也可以将QThread作为self中的第二个参数传递给myThread。 s __init__

在第二个注释中:您几乎总是希望将父对象传递给每个从Qt QObject派生的新创建对象(请参阅此处:https://stackoverflow.com/a/30354276/6205205