2017-06-27 6 views
1

私はQT5スレッドの基礎を学びたいと考えています。これは私の最初の試みで、様々な情報源から組み合わされています。PyQt5 QThread Issue

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をサブクラス化すべきではないことを知りました。他の問題は、あなたがによってdo_work呼び出さなければならないということです

def Worker(QObject): 

class Worker(QObject): 

に:あなたは2つの問題を抱えている

答えて

1

は、最初はそれが変わるため、作業者がクラスでなければならないということですインスタンスは、すなわち自己は、それが変更のために:

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

すっごい、このような愚かな過ちを、それを信じることができません。どうもありがとう – Anonimista

関連する問題