【问题标题】:PyQT5 show spend time on windowPyQT5 显示在窗口上花费的时间
【发布时间】:2020-04-28 01:18:45
【问题描述】:

我有 QMediaPlayer 和 QVideoWidget 用于播放花时间 QLineEdit 和完成程序 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())

但问题是当视频开始播放时,程序卡住了。欢迎对我的代码提供任何帮助和/或改进。

【问题讨论】:

    标签: python multithreading pyqt pyqt5


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 2016-11-18
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多