Привет. Я занимаюсь разработкой приложения 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.