2017-04-13 23 views
0

私はPyQtの新機能です。QThreadingをやりたいだけです。 AttributeError: は、しかし、私はエラーを取得しています 'myThread' オブジェクトが 'UI' を何の属性を持っていないPyQtスレッディングアトリビュートエラー

マイコード:私は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_() 

答えて

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!')) 

このアプローチは(QThreadparentとしてanaPencereを使用して)場合もmyThread__init__で2番目の引数としてselfを渡すことができます。二ノートで

:あなたはほとんど常にQtのQObjectから派生したそれぞれの新しい作成されたオブジェクトの親オブジェクトを渡したい(ここを参照してください:https://stackoverflow.com/a/30354276/6205205