2017-04-13 79 views
0

我是PyQt的新手,我只是想做QThreading。 但我发现了错误:AttributeError的: 'MyThread的' 对象有没有属性 'UI'PyQt线程属性错误

我的代码:

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的?

回答

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作为QThreadparent),你也可以通过selfmyThread__init__第二个参数。

在第二记:你几乎总是要通过父对象到每个新创建的对象,从Qt的QObject派生(在这里看到:https://stackoverflow.com/a/30354276/6205205