Таймер обратного отсчета PyQt в формате мм: сс - PullRequest
2 голосов
/ 25 мая 2020

Итак, я пытался создать простой GUI UI, который будет отсчитывать время при запуске. У меня есть рабочий код, над которым я работал, но я не уверен, как запустить время в формате MM: SS.

Это мой GUI

enter image description here

Когда я нажимаю "Пуск", метка меняется на 60 (очевидно).

enter image description here

Цель состоит в том, чтобы установите фиксированное время, например 10 минут, и чтобы он начинался в 10:00, и go до 09:59, 09:58, и т. д. c.

Это код У меня пока:

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import QtCore
import sys

DURATION_INT = 60

class App(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        # 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.setText("01:00")
        self.timerLabel.move(50,50)
        self.timerLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.timerLabel.setStyleSheet("font: 25pt 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("Stop")
        self.stopButton.move(50,130)

        # Show window
        self.win.show()
        sys.exit(app.exec_())

    def startTimer(self):
        self.time_left_int = DURATION_INT

        self.myTimer = QtCore.QTimer(self)
        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):
        self.timerLabel.setText(str(self.time_left_int))

app = QtWidgets.QApplication(sys.argv)
main_window = App()
main_window.show()
sys.exit(app.exec_())

1 Ответ

1 голос
/ 26 мая 2020

Чтобы ответить на ваш конкретный c вопрос, вам необходимо преобразовать значение self.time_left_int в форматированную строку перед обновлением текста в виджете self.timerLabel. Вот функция, которая выполняет это преобразование.

def secs_to_minsec(secs: int):
    mins = secs // 60
    secs = secs % 60
    minsec = f'{mins:02}:{secs:02}'
    return minsec

Другая проблема вашей программы заключается в том, что вы определяете переменные self.time_left_int и self.myTimer в функции-члене startTimer. Поскольку это переменные-члены класса App, вместо этого они должны быть определены в __init__().

Ниже представлена ​​полная версия вашей программы, которая исправляет эти проблемы. Другие изменения, которые я внес:

  • Уменьшен размер текста в self.timerLabel, чтобы он не превышал размер своего фрейма на моей машине; вам может потребоваться изменить его обратно для ваших собственных целей.
  • Установите DURATION_INT на 600 секунд вместо 60, чтобы отсчет продолжался с 10:00 вместо 01:00.
  • Добавлено вызов self.update_gui() ближе к концу __init__(), чтобы при запуске программы отображалось начальное значение DURATION_INT.

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import QtCore
import sys

DURATION_INT = 600

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.setText("01:00")
        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("Stop")
        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)

app = QtWidgets.QApplication(sys.argv)
main_window = App()
main_window.show()
sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...