2016-12-07 12 views
-1

ワーカースレッドからメインGUIスレッドに信号を送る方法は分かっていますが、メインスレッドからワーカースレッドに信号を送るにはどうしたらいいですか?PyQt5:ワーカースレッドに信号を送る方法

信号とスロットを含むサンプルコードです。ここで私はメインスレッドにシグナルを送り返しますが、どうすれば反対の方向に進むことができますか?

ここでの目標は、スレッドを停止させたいときにself.doの値を0に変更する信号を送信することです。

は、ここでの主なファイルだと私は

from PyQt5 import QtWidgets 
from PyQt5.QtWidgets import QMainWindow 
from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot 
from progressUI import Ui_Form 

import sys 
import time 

class ProgressBar(QObject): 
    progress = pyqtSignal(int) 
    kill = pyqtSignal() 

    def __init__(self, timer, parent=None): 
     super(ProgressBar, self).__init__(parent) 
     self.time = timer 
     self.do = 1 

    def work(self): 

     while self.do == 1: 
      y = 0 
      for _ in range(100): 
       time.sleep(.1) 
       y += 1 
       self.progress.emit(y) 
      break 

     self.kill.emit() 

    @pyqtSlot(str) 
    def worker_slot(self, sentence): 
     print(sentence) 

class Go(QMainWindow, Ui_Form, QObject): 
    custom_signal = pyqtSignal(str) 

    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 
     self.setupUi(self) 
     self.progressBar.setValue(0) 
     self.startThread() 

    @pyqtSlot(int) 
    def updateProgress(self, val): 
     self.progressBar.setValue(val) 
     self.custom_signal.emit('hi from main thread') 

    def startThread(self): 
     self.progressThread = ProgressBar(60) 
     self.thread = QThread() 
     self.progressThread.moveToThread(self.thread) 

     self.progressThread.progress.connect(self.updateProgress) 
     self.progressThread.kill.connect(self.thread.quit) 
     self.custom_signal.connect(self.progressThread.worker_slot) 
     self.thread.started.connect(self.progressThread.work) 

     self.thread.start() 



if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    MainApp = Go() 
    MainApp.show() 
    sys.exit(app.exec_()) 

ここでUIファイルがあります下にUIファイルを入れます。

from PyQt5 import QtCore, QtGui, QtWidgets 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName("Form") 
     Form.resize(658, 118) 
     self.progressBar = QtWidgets.QProgressBar(Form) 
     self.progressBar.setGeometry(QtCore.QRect(30, 40, 601, 23)) 
     self.progressBar.setProperty("value", 24) 
     self.progressBar.setObjectName("progressBar") 
     self.label = QtWidgets.QLabel(Form) 
     self.label.setGeometry(QtCore.QRect(45, 75, 581, 26)) 
     self.label.setAlignment(QtCore.Qt.AlignCenter) 
     self.label.setObjectName("label") 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     _translate = QtCore.QCoreApplication.translate 
     Form.setWindowTitle(_translate("Form", "Form")) 
     self.label.setText(_translate("Form", "TextLabel")) 
+0

あなたのコードは実行可能ではありません。タイプミスがあり、UIにアクセスできません。 – ImportanceOfBeingErnest

+0

いいえ、コードを実行していません。それは見てあなたのためのサンプルです。 – squirtgun

+1

それで、私はそれを見て、私はそれが動作していないことを見ます。とにかく、あなたが労働者に信号を送ることを妨げているのは何ですか? – ImportanceOfBeingErnest

答えて

0

どのように信号をワーカースレッドに送信しますか?ワーカースレッドからGUIに信号を送信するのとまったく同じ方法です。私はもっ​​と違うと思った。

@ 3本のパイナップルは、メインスレッドとワーカースレッド間の双方向通信の優れた例にリンクされています。

メインGUIスレッドでカスタム信号を作成する場合は、QObjectを継承していることを確認してからカスタム信号を作成する必要があります。

元の投稿のコードを更新して実行できるように、UIファイルを含めました。カスタム信号の例をGUIスレッドに含め、ワーカーに信号を送りました。

しかし、forループが終了するまでprintステートメントの出力は表示されません。つまり、@ three-pineapplesも記述されているように、ワーカーがシグナルを処理しないようにします。

これは最良の例ではありませんが、誰かがこのコンセプトを理解するのに同じ問題を抱えている場合は、これが役に立ちます。

関連する問題