【发布时间】:2020-06-03 22:38:33
【问题描述】:
所以我的代码会打开一个倒计时的 GUI 计时器。看起来像这样:
因此,根据代码,应用程序最初会从 15 秒开始倒计时,当它达到零时,它将重置为 5 秒,然后再次倒计时 15 秒。最终目标是每隔几分钟提醒我做几秒钟的事情。这些初始时间只是为了测试。
因此,当计时器为零时,我会等待几秒钟,然后它才会重置为初始 int。与此同时,我试图显示一个窗口 10 的 toast 通知,但问题是当它出现时,时钟卡住了,在那段时间之后应用程序关闭。所以基本上我可以看到吐司几秒钟,但计时器不会重置,应用程序会关闭。
这是我的代码:
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import QtCore
import sys
import time
from win10toast import ToastNotifier
import itertools
DURATION_INT = 15
toaster = ToastNotifier()
TIME_CYCLER = itertools.cycle([15, 5]) # 10 minutes, 10 seconds
def secs_to_minsec(secs: int):
mins = secs // 60
secs = secs % 60
minsec = f'{mins:02}:{secs:02}'
return minsec
class App(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.time_left_int = DURATION_INT
self.myTimer = QtCore.QTimer(self)
# App window
self.app = QApplication(sys.argv)
self.win = QMainWindow()
self.win.setGeometry(200, 200, 200, 200)
self.win.setWindowTitle("test")
# Widgets
self.titleLabel = QtWidgets.QLabel(self.win)
self.titleLabel.setText("Welcome to my app")
self.titleLabel.move(50,20)
self.timerLabel = QtWidgets.QLabel(self.win)
self.timerLabel.move(50,50)
self.timerLabel.setAlignment(QtCore.Qt.AlignCenter)
self.timerLabel.setStyleSheet("font: 10pt Helvetica")
self.startButton = QtWidgets.QPushButton(self.win)
self.startButton.setText("Start")
self.startButton.move(50,100)
self.startButton.clicked.connect(self.startTimer)
self.stopButton = QtWidgets.QPushButton(self.win)
self.stopButton.setText("Minimize")
self.stopButton.move(50,130)
self.update_gui()
# Show window
self.win.show()
sys.exit(app.exec_())
def startTimer(self):
self.time_left_int = next(TIME_CYCLER)
self.myTimer.timeout.connect(self.timerTimeout)
self.myTimer.start(1000)
def timerTimeout(self):
self.time_left_int -= 1
if self.time_left_int == 0:
toaster.show_toast("test", "test", duration=5)
self.time_left_int = next(TIME_CYCLER)
self.update_gui()
def update_gui(self):
minsec = secs_to_minsec(self.time_left_int)
self.timerLabel.setText(minsec)
# def minimize():
# pass
app = QtWidgets.QApplication(sys.argv)
main_window = App()
main_window.show()
sys.exit(app.exec_())
也许我的逻辑与def timerTimeout(self):函数存在缺陷,但据我了解,计时器应该为零,显示通知,将self.time_left_int重置为下一个值,然后调用self.update_gui()函数。就我而言,show_toast 似乎是最后发生的事情。
任何帮助表示赞赏:)
【问题讨论】: