我写了一个简单的脚本,弹出一个窗口并启动倒计时。它看起来像这样。
当计时器到达零点时,它会重置为7秒(或我在变量中设置的任何时间)。我想用一个30秒的计时器来启动应用程序,让它倒计时到零,然后重置到10秒,再到30秒,以此类推。utlimate的目标是每隔10分钟左右提醒我做某事,但只提醒几秒钟。所以举例来说,应用会从10分钟开始倒计时,到了零点,提醒我拉伸10秒,但是当这10秒到了之后,它又会重置为10分钟,以此类推,直到我关闭应用。
这是我目前得到的代码。
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import QtCore
import sys
import time
from win10toast import ToastNotifier
DURATION_INT = 7
toaster = ToastNotifier()
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 = DURATION_INT
self.myTimer.timeout.connect(self.timerTimeout)
self.myTimer.start(1000)
def timerTimeout(self):
self.time_left_int -= 1
if self.time_left_int == 0:
self.time_left_int = DURATION_INT
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_())
我不知道如何合理地完成我的工作,希望得到帮助。
使用 itertools.cycle
要在一系列值之间无限期地循环,那么只需调用 next()
在你的超时代码中。每次调用都会得到循环中的下一个值。
import itertools
TIME_CYCLER = itertools.cycle([30, 10]) # 30 seconds, 10 seconds
# your other code here
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:
self.time_left_int = next(TIME_CYCLER)