Шаг 52.
Библиотека PyQt5.
Обработка сигналов и событий. Использование таймеров

    На этом шаге мы рассмотрим один способ задания таймера.

    Таймеры позволяют через заданный интервал времени выполнять метод с предопределенным названием timerEvent(). Для назначения таймера используется метод startTimer() класса QObject. Формат метода:

  <Id> = <Объект>.startTimer(<Интервал>[, timerType=<Tип таймера>])

    Параметр <Интервал> задает промежуток времени в миллисекундах, по истечении которого выполняется метод timerEvent(). Минимальное значение интервала зависит от операционной системы. Если в параметре <Интервал> указать значение 0, то таймер будет срабатывать много раз при отсутствии других необработанных событий.

    Необязательный параметр timerType позволяет указать тип таймера в виде одного из атрибутов класса QtCore.Qt:

    Метод startTimer() возвращает идентификатор таймера, с помощью которого впоследствии можно остановить таймер.

    Формат метода timerEvent() :

  timerEvent (self, <Объект класса QTimerEvent>)

    Внутри него можно получить идентификатор таймера с помощью метода timerId() объекта класса QTimerEvent.

    Чтобы остановить таймер, необходимо воспользоваться методом killTimer() класса QObject. Формат метода:

  <Объект>.killTimer (<Id>)

    В качестве параметра указывается идентификатор, возвращаемый методом startTimer().

    Создадим в окне часы, которые будут отображать текущее системное время с точностью до секунды, и добавим возможность запуска и остановки часов с помощью соответствующих кнопок.

# -*- coding:  utf-8 -*-
from PyQt5 import QtCore, QtWidgets
import time
class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowTitle("Часы в окне")
        self.resize(200, 100)
        self.timer_id = 0
        self.label = QtWidgets.QLabel("")
        self.label.setAlignment (QtCore.Qt.AlignHCenter)
        self.button1 = QtWidgets.QPushButton("Запустить")
        self.button2 = QtWidgets.QPushButton("Остановить")
        self.button2.setEnabled(False)
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(self.label)
        vbox.addWidget(self.button1)
        vbox.addWidget(self.button2)
        self.setLayout(vbox)
        self.button1.clicked.connect(self.on_clicked_button1)
        self.button2.clicked.connect(self.on_clicked_button2)
    def on_clicked_button1(self):
        # Задаем интервал в 1 секунду и "приближенный" таймер
        self.timer_id = self.startTimer(1000, timerType = QtCore.Qt.VeryCoarseTimer)
        self.button1.setEnabled(False)
        self.button2.setEnabled(True)
    def on_clicked_button2(self):
        if self.timer_id:
            self.killTimer(self.timer_id)
            self.timer_id = 0
        self.button1.setEnabled(True)
        self.button2.setEnabled(False)
    def timerEvent(self, event):
        self.label.setText(time.strftime("%H:%M:%S"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.show()
    sys.exit(app.exec_())
Архив с файлом можно взять здесь.

    Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг