Потоки в PyQt5. Проблема c переопределением cвойства флага

Рейтинг: 1Ответов: 2Опубликовано: 08.03.2023

Имеет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'

Ответы

▲ 1Принят

Если я вас правильно понял, то попробуйте так

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()) 

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

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

▲ 1

Добавьте в метод run эту строку (в начало)

self.taskActive = True

А в классе Window это строка совершенно бесполезна.