PyQT5 шоу проводят время на окне - PullRequest
1 голос
/ 28 апреля 2020

У меня есть QMediaPlayer и QVideoWidget для воспроизведения видео с затраченным временем QLineEdit и конечной sh программой QLineEdit. Я пытаюсь сделать счетчик, который показывает, сколько минут пользователь потратил на эту программу, и когда пользователь достигает конечной программы, всплывающее диалоговое окно. Для этого я создаю функцию потока:

def update_video_timer(self):
    end_time = int(self.end_time.text())
    start_time = 0
    while start_time <= end_time:
        self.spended_time.setText(str(start_time))
        start_time = start_time + 1
        # minutes
        time.sleep(60)

    # reachs limit
    self.mediaPlayer.pause()
    dlg = QDialog(self)
    dlg.setWindowTitle("YOUR TIME HAS FINISHED!")
    dlg.exec_()

Я вызываю эту функцию, когда начинается воспроизведение первого видео:

from threading import Thread
Thread(target=self.update_video_timer())

Но проблема в том, что когда видео начинает воспроизводиться, программа зависает , Любая помощь и / или улучшение моего кода приветствуется.

1 Ответ

2 голосов
/ 28 апреля 2020

Задачи в GUI должны быть асинхронными и вызывать синхронные задачи, которые занимают очень мало времени. Если синхронные задачи занимают много времени, они должны выполняться в другом потоке. В вашем случае нет необходимости использовать while + time.sleep (), но достаточно счетчика с QTimer, и поэтому нет необходимости использовать потоки:

    self.timer = QTimer(self, interval=60 * 1000)
    self.timer.timeout.connect(self.on_timeout)
    self.start_time = 0
    self.end_time = 0

def start(self):
    try:
        self.end_time = int(self.end_time.text())
    except ValueError as e:
        print("error")
    else:
        self.timer.start()

def on_timeout(self):
    if self.start_time <= self.end_time:
        self.start_time += 1
        self.spended_time.setText(str(self.start_time))
    else:
        self.timer.stop()
        self.mediaPlayer.pause()
        dlg = QDialog(self)
        dlg.setWindowTitle("YOUR TIME HAS FINISHED!")
        dlg.exec_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...