PyQt自动将计时器重新启动为另一个数字

时间:2020-06-03 14:00:34

标签: python pyqt

我写了一个简单的脚本,它弹出一个窗口并启动倒数计时器。看起来像这样:

enter image description here

当计时器达到零时,它将重置为7秒(或我在该变量中设置的任何数值)。我想使用30秒的计时器启动该应用,将其倒计时为零,重置为10秒,然后再次设置为30,依此类推。最好的目标是提醒我每10分钟左右执行一次操作,但只能执行几秒钟。因此,例如,该应用程序将从10分钟开始递减计数,达到零,提醒我伸展10秒钟,但是当这10秒钟结束时,它将再次重置为10分钟,依此类推,直到我关闭该应用程序。 / p>

这是到目前为止我得到的代码:

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

我不确定如何合理地做我想做的事情,任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用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)