2017-06-27 49 views
1

我想了解QT5线程的基础知识。这是我第一次尝试,结合各种来源:PyQt5 QThread问题

import sys 
from time import sleep 

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout 

from PyQt5.QtCore import QThread, QObject 


''' 

Traceback (most recent call last): 
    File "threads.py", line 68, in <module> 
    main(sys.argv) 
    File "threads.py", line 63, in main 
    window = Window() 
    File "threads.py", line 15, in __init__ 
    self.initUi() 
    File "threads.py", line 28, in initUi 
    self.worker.moveToThread(self.thread) 
AttributeError: 'NoneType' object has no attribute 'moveToThread' 
Press any key to continue . . . 

''' 



class Window(QWidget): 

    def __init__(self): 

     super().__init__() 
     self.initUi() 

     self.low = 0 
     self.high = 100 

     self.show() 


    def initUi(self): 


     self.thread = QThread() 
     self.worker = Worker(self) 
     self.worker.moveToThread(self.thread) 
     self.thread.start() 

     self.button = QPushButton(
       'Start long running task') 

     self.layout = QGridLayout()   
     self.layout.addWidget(self.button, 0, 0) 

     self.setLayout(self.layout) 



def Worker(QObject): 

    def __init__(self, parent): 
     super(Worker, self).__init__(parent) 
     do_work() 

    def do_work(self): 

     for _ in range(20): 
      print('running . . .') 
      sleep(2) 



def main(args): 

    app = QApplication(args) 
    window = Window() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main(sys.argv) 

我已经在代码片段中包含了错误。 从在线文章中我了解到,在PyQt5中,我不应该继承QThread。

回答

1

你有两个问题,第一个是工人必须是类为它的变化:

def Worker(QObject): 

class Worker(QObject): 

另一个问题是,你必须通过以下方式调用do_work实例,即自我,因为它改变了:

do_work() 

到:

self.do_work() 

在下面的部分,我展示一个完整的例子:

import sys 

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout 

from PyQt5.QtCore import QThread, QObject 


class Window(QWidget): 

    def __init__(self): 

     super().__init__() 
     self.initUi() 

     self.low = 0 
     self.high = 100 

     self.show() 


    def initUi(self): 


     self.thread = QThread() 
     self.worker = Worker() 
     self.worker.moveToThread(self.thread) 

     self.thread.started.connect(self.worker.do_work) 
     self.thread.finished.connect(self.thread.deleteLater) 

     self.button = QPushButton(
       'Start long running task') 

     self.button.clicked.connect(self.thread.start) 

     self.layout = QGridLayout()   
     self.layout.addWidget(self.button, 0, 0) 
     self.setLayout(self.layout) 



class Worker(QObject): 
    def __init__(self, parent=None): 
     QObject.__init__(self, parent=parent) 

    def do_work(self): 
     for _ in range(20): 
      print('running . . .') 
      QThread.sleep(2) 



def main(args): 

    app = QApplication(args) 
    window = Window() 
    window.show() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main(sys.argv) 
+0

OMG这样愚蠢的错误,简直不敢相信。非常感谢 – Anonimista