Дополнительный поток QThread не работает

Проблема в том что класс WorkTread не работает. Для диагностики я добавил print. Но он тоже не отображается.

import sys
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

import paho.mqtt.subscribe as subscribe                 


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(bool)

    def __init__(self):
        super().__init__()

    def run(self):
        while(True):
            self.statusLight = subscribe.simple("Light/forvard", hostname="192.168.1.100", auth={"username":"skorpia", "password":"n-h"})
            print("hello") # ВОТ ЭТО
            if statusLight.payload == b'0':
                self.on_threadSignal(self)
                self.threadSignal.emit(True)
                print("hello")
#            self.msleep(5000)                          # пауза, например 5 сек.
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  

class Window(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Title qq")
#        self.setGeometry(400, 400, 400,400)

        self.centralWidget = QWidget()                                         # +++
        self.setCentralWidget(self.centralWidget)                              # +++

        self.runBtn = QtWidgets.QPushButton()
        self.runBtn.setCheckable(True)
        self.runBtn.setText("Y")
#        self.runBtn.setGeometry(300,300,300,300)
        self.runBtn.setObjectName("runBtn")
        self.runBtn.clicked.connect(self.runProcess)
#        self.runBtn.show()
        
        layout = QHBoxLayout(self.centralWidget)
        layout.addWidget(self.runBtn)

    def runProcess(self):
        self.thread = WorkThread()
        self.thread.threadSignal.connect(self.on_threadSignal)
#        self.thread.start()    

#        time.sleep(1)
        self.runBtn.setChecked(0)
        
    def on_threadSignal(self, rez):
        if rez:
            self.runBtn.setChecked(1)                           # how should this be done?


def appli():
        app = QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
        
if __name__ == '__main__':
    appli()

Ответы (1 шт):

Автор решения: S. Nick

Я не знаком с paho, поэтому что свзано с ним я закоментировал.

Чтобы запустить дополнительный поток надо выполнить

self.thread.start() 

и в дополнительном потоке начнется выполняться метод run.

Нельзя из дополнительного потока атрибутам и методам основного потока.
Это self.on_threadSignal(self) - неправильно.

import sys
import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

#import paho.mqtt.subscribe as subscribe                 


class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(bool)

    def __init__(self):
        super().__init__()

    def run(self):
        while(True):
#            vvvv  <---  не знаю дл чего вам  self.       
#            self.statusLight = subscribe.simple("Light/forvard", hostname="192.168.1.100", auth={"username":"skorpia", "password":"n-h"})
            statusLight = b'0'

            print("hello 1")                  # ВОТ ЭТО
#            if statusLight.payload == b'0':
            if statusLight == b'0':
# ???                self.on_threadSignal(self)         #  !!! это не правильно                     
                self.threadSignal.emit(True)
                print("hello 2")
            self.msleep(2000)                           # пауза, например 2 сек.
  

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Title qq")
        self.centralWidget = QWidget()  
        self.setCentralWidget(self.centralWidget)

        self.runBtn = QtWidgets.QPushButton()
        self.runBtn.setCheckable(True)
        self.runBtn.setText("Y")
        self.runBtn.setObjectName("runBtn")
        self.runBtn.clicked.connect(self.runProcess)
        
        layout = QHBoxLayout(self.centralWidget)
        layout.addWidget(self.runBtn)

    def runProcess(self):
        self.thread = WorkThread()
        self.thread.threadSignal.connect(self.on_threadSignal)
        self.thread.start()                                      # !!! +++ это обязательно        

        self.runBtn.setChecked(0)
        
    def on_threadSignal(self, rez):
        if rez:
            self.runBtn.setChecked(1)     # how should this be done?
            print("hello runBtn.setChecked(1)")


def appli():
        app = QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
        
if __name__ == '__main__':
    appli()

введите сюда описание изображения

→ Ссылка