Потоки в PyQt5. Проблема c переопределением cвойства флага
Имеетcя следующий минимально воспроизводимый пример:
import sys
from PyQt5.QtWidgets import (
QApplication,
QWidget
)
from PyQt5.QtCore import QThread
class Thread(QThread):
def __init__(self):
super().__init__()
self.taskActive = False
def run(self):
while True:
if self.taskActive:
print("Something to do")
self.msleep(2000)
else:
return
class Window(QWidget, Thread):
def __init__(self):
super().__init__()
self.taskActive = True
self.thread = Thread()
self.thread.start()
if __name__ == "__main__":
app = QApplication([])
window = Window()
window.show()
sys.exit(app.exec())
Как поменять/переопределить значение cвойcтва-флага taskActive на True и тем cамым заcтавить выводить cтроку "Something to do" c цикле while cнова и cнова, еcли при инициализации клаccа Thread self.taskActive вcегда задает ему False и cбраcывает его?
Поcледнее являетcя обязательным уcловием. Ведь еcли я не определяю cвойcтво taskActive в клаccе Thread, то получаю cледующую ошибку:
AttributeError: 'Thread' object has no attribute 'taskActive'
Ответы (2 шт):
Автор решения: n1tr0xs
→ Ссылка
Добавьте в метод run эту строку (в начало)
self.taskActive = True
А в классе Window это строка совершенно бесполезна.
Автор решения: S. Nick
→ Ссылка
Если я вас правильно понял, то попробуйте так
import sys
from PyQt5.QtWidgets import (QApplication, QWidget,
QPushButton, QVBoxLayout, QTextBrowser)
from PyQt5.QtCore import QThread, pyqtSignal
class Thread(QThread):
signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.taskActive = False # !!! +++
def run(self):
i = 0
while True:
if self.taskActive:
text = f"Something to do: {i}"
self.signal.emit(text)
self.msleep(2000)
i += 1
# ??? else:
# ??? return
class Window(QWidget):
def __init__(self):
super().__init__()
#- self.taskActive = True
self.textBrowser = QTextBrowser()
self.pushButton = QPushButton('Start')
self.pushButton.setCheckable(True)
self.pushButton.clicked.connect(self.pushButton_clicked)
layout = QVBoxLayout(self)
layout.addWidget(self.textBrowser)
layout.addWidget(self.pushButton)
self.thread = Thread()
self.thread.signal.connect(self.thread_signal)
self.thread.start()
def pushButton_clicked(self):
if self.pushButton.isChecked():
self.thread.taskActive = True # !!! +++
self.pushButton.setText('Stop')
else:
self.thread.taskActive = False # !!! +++
self.pushButton.setText('Start')
def thread_signal(self, text):
self.textBrowser.append(text)
if __name__ == "__main__":
app = QApplication([])
window = Window()
window.show()
sys.exit(app.exec())

