Дополнительный поток 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()
