2017-07-02 8 views
-1

以下のコードは、ラベルとボタンを持つ単一のダイアログを作成します。 ボタンを押すとonClick関数が呼び出され、がタスクとして機能し、queuethreadをトリガーとしてジョブを実行します。スレッドの完了後にウィジェットを更新する方法

スレッドが完了したら、dialog.onThreadCompletedメソッドに呼び出して、計算結果を引数として渡します。この方法ではthreadの計算結果をself.labelに更新します。それを達成する方法?

enter image description here

import threading 
import Queue as Queue 
import functools 

global queue 
queue = Queue.Queue() 


class Thread(QThread): 
    def __init__(self, parent=None): 
     QThread.__init__(self, parent) 

    def run(self): 
     global queue 
     while True: 
      partial = queue.get() 
      output = partial() 
      queue.task_done() 


threads = [] 
thread = Thread() 
threads.append(thread) 
thread.start() 


def calculate(number): 
    for i in range(number): 
     i += i 
    print 'calculate completed. result: %s' % i 
    return i 


class Dialog(QDialog): 
    def __init__(self, parent=None): 
     QDialog.__init__(self, parent) 
     self.setLayout(QVBoxLayout()) 
     self.label = QLabel(self) 
     self.label.setText('This label should display result') 
     self.layout().addWidget(self.label) 
     button = QPushButton('Start process') 
     button.clicked.connect(self.onClick) 
     self.layout().addWidget(button) 

    def onThreadCompleted(self, result): 
     self.label.setText(str(result)) 

    def onClick(self): 
     self.label.setText('Calculation is starting...') 
     partial = functools.partial(calculate, number=100000000) 
     queue.put(partial) 

if __name__ == '__main__': 
    app = QApplication([]) 
    dialog = Dialog() 
    dialog.show() 
    qApp.exec_() 

答えて

1

私は(無QueueまたはThread、単にQThread)のみPyQtを使用するためにあなたのコードを変更することを決めました。私はコードが自明であることを願っています。そうでない場合は、ただ質問してください:)

from PyQt4 import QtCore, QtGui 
from PyQt4.QtGui import QDialog 
from PyQt4.QtGui import * 

import sys 

class Thread(QtCore.QObject): 
    finished = QtCore.pyqtSignal() 

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

     self.TheWorker = QtCore.QThread() 
     self.moveToThread(self.TheWorker) 
     self.TheWorker.start() 

     self.number = 0 

    def calculate(self): 
     num = 10000 
     for i in range(num): 
      self.number += i 
     print 'calculate completed. result: %s' % self.number 
     self.finished.emit() 

class Dialog(QDialog): 
    def __init__(self, parent=None): 
     QDialog.__init__(self, parent) 

     # worker which will do the job or you on different thread 
     self.myWorker = Thread() 
     # catched signal about finishing the job and calls desired method 
     self.myWorker.finished.connect(self.onThreadCompleted) 

     self.setLayout(QVBoxLayout()) 
     self.label = QLabel(self) 
     self.label.setText('This label should display result') 
     self.layout().addWidget(self.label) 
     button = QPushButton('Start process') 
     button.clicked.connect(self.myWorker.calculate) 
     self.layout().addWidget(button) 

    def onThreadCompleted(self): 
     self.label.setText(str(self.myWorker.number)) 

    # to quit the thread properly 
    def quitThread(self): 
     self.myWorker.TheWorker.quit() 
     self.myWorker.TheWorker.wait() 

if __name__ == '__main__': 
    app = QApplication([]) 
    dialog = Dialog() 
    dialog.show() 
    qApp.exec_() 
    dialog.quitThread() 
    sys.exit() 
関連する問題