PyQt5 QThread не останавливается ни с помощью terminate, ни с помощью флажка - PullRequest
0 голосов
/ 21 апреля 2020

Привет. Я занимаюсь разработкой приложения PyQt5, в котором пользователь может установить таймер обратного отсчета. Для обновления метки времени я использую QThread, который генерирует pyqtSignal каждую секунду для обновления метки GUI / времени. Это мой код, который использует QThread:

из PyQt5.QtCore import QThread, pyqtSignal, время импорта QObject

class Worker(QObject):
    update = pyqtSignal()
    stop = pyqtSignal()


class CountdownThread(QThread):
    def __init__(self, time_left):
        QThread.__init__(self)
        self.time_signal = Worker()
        self.time_left = time_left
        self.is_running = True


    def stop(self):
        self.is_running = False
        print(self.is_running)


    def run(self):
        while self.is_running:
            self.time_left -= 1
            time.sleep(1)
            self.time_signal.update.emit()
            if self.time_left == 0:
                self.stop()

При нажатии кнопки пользователь должен иметь возможность остановить обратный отсчет и сброс GUI:

...

    def pressed_stop(self):
        self.start_stop_btn.setText("Start")
        self.start_stop_btn.clicked.connect(self.pressed_start)
        self.worker.stop() # self.worker is the QThread

...

Когда я нажимаю на кнопку, текст кнопки, безусловно, меняется на «Пуск». Но метка времени продолжает обратный отсчет. При печати переменной is_running печатается False при нажатии кнопки и, следовательно, при выполнении функции self.worker.stop(), но при этом сохраняется печать True в while l oop из run().

Инициализация CountdownThread выполняется здесь (после нажатия кнопки запуска):

...

    def count_down(self):
        self.worker = CountdownThread(self.time_left)
        self.worker.time_signal.update.connect(self.update_time_label)
        self.worker.time_signal.stop.connect(self.reset_timer)
        self.worker.start()

...

Почему это не работает? Я запускаю это приложение на Ma c ОС Catalina 10.15.4.

1 Ответ

0 голосов
/ 21 апреля 2020

Как некоторые могли заметить, я использую один и тот же объект кнопки для запуска и остановки обратного отсчета. Я забыл добавить

self.start_stop_btn.disconnect()

в противном случае он всегда будет вызывать функцию обратного отсчета снова

...