メインコンテンツまでスキップ

シンプルなタイマーを作ろう

PySide の GUI を、定期的にアップデートしたいような事はよくあります。
そういったときに QThread をつかって更新をスレッドにする手もありますが、簡単なものなら
QTimer を使用することで、手軽に作成できるので使い方を説明します。

# -*- coding: utf-8 -*-
import sys
from PySide2.QtCore import (QTimer, QObject)
from PySide2.QtWidgets import (QApplication, QDialog, QLineEdit, QVBoxLayout)

FORMAT = "今のカウントは {count} です。"


class TimerSample(QDialog):

def __init__(self, parent=None):
super().__init__(parent=parent)

self.count = 0

self.line = QLineEdit(self)
self.line.setText(FORMAT.format(count=str(self.count)))

layout = QVBoxLayout()
layout.addWidget(self.line)
self.setLayout(layout)

self.timer = QTimer(self)
self.timer.timeout.connect(self.timeout)
self.timer.setInterval(1000)
self.timer.start()
self.timer.singleShot(10000, self.singleShotA)
self.timer.singleShot(15000, self.singleShotB)


def timeout(self):

self.count += 1
self.line.setText(FORMAT.format(count=str(self.count)))

def singleShotA(self):

self.timer.stop()
self.line.setText("カウント終了!")

def singleShotB(self):

self.timer.start()


if __name__ == "__main__":
app = QApplication()
a = TimerSample()
a.show()
app.exec_()

サンプルコードは以上です。

基本的な使い方​

QTimer は、その名の通り一定間隔でシグナルを発する機能を持ちます。 間隔は setInterval(ミリ秒) または、 start() の引数で間隔を指定します。 上の例ならば、1秒おきにシグナルが発行されて、 timeout シグナルに接続された timeout 関数が呼ばれます。

SingleShot​

start を使用することで、定期的にシグナルを発行できましたが それとは別に singleShot と呼ばれる機能もあります。 これは、定期実行ではなく、指定の秒数(ミリ秒)後にその名の通り1度だけ 実行する関数を指定できます。

サンプルコードの場合、

        self.timer.singleShot(10000, self.singleShotA)
self.timer.singleShot(15000, self.singleShotB)

10 秒後に singleShotA 関数を実行し、タイマーを停止したあと、 15 秒後に再開する関数を呼び出します。

singleShot はこのように複数指定ができます。