我有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())
但是问题是,当视频开始播放时,程序被冻结。欢迎对我的代码进行任何帮助和/或改进。
答案 0 :(得分:2)
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_()