2024-05-16

QLCDNumber と QTimer ~ PySide6

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

GUI アプリで決まった間隔で表示の更新などの処理をさせたい場合、QTimer を利用すると簡単に処理を実装できます。

今回のテーマ
  • PySide6 の QLCDNumber と QTimer クラスを利用して、シンプルなデジタル時計アプリを作ります。

下記の OS 環境で動作確認をしています。

RHEL 9.4 x86_64
Python 3.12.1
PySide6 6.7.0

メインの PC に Fedora Linux を利用していましたが、今月初めに dnf update でパッケージを更新した後、Fedora Linux 40 上 venv で利用している PySide6 アプリがコアダンプを吐いて利用できなくなりました。原因がわからず、日々利用している自作アプリに支障が出たので、やむなく RHEL に切り替えています [3]

サンプルと実行例を以下に示しました。

qt_lcdnumber.py
import datetime
import sys
from PySide6.QtCore import QTimer
from PySide6.QtWidgets import (
QApplication,
QLCDNumber,
QVBoxLayout,
QWidget,
)
class Example(QWidget):
def __init__(self):
super().__init__()
self.setFixedSize(200, 50)
self.setWindowTitle('Clock')
box = QVBoxLayout()
box.setContentsMargins(0, 0, 0, 0)
self.setLayout(box)
self.lcd = QLCDNumber(self)
self.lcd.setDigitCount(8)
self.lcd.display('00:00:00')
box.addWidget(self.lcd)
timer = QTimer(self)
timer.timeout.connect(self.update_time)
timer.start(1000)
def update_time(self):
dt_now = datetime.datetime.now()
self.lcd.display(dt_now.strftime('%H:%M:%S'))
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
view raw qt_lcdnumber.py hosted with ❤ by GitHub
qt_lcdnumber.py の実行例

QTimer クラスを使用するには、QTimer のインスタンスを作成し、timeout() シグナルを適切なスロット(処理するメソッド)に接続し、msec で間隔を指定した start() メソッドを呼び出します。以降、指定された間隔で timeout() シグナルが発せられます。

timer = QTimer(self)
timer.timeout.connect(self.update_time)
timer.start(1000)

本サンプルでは 1000 msec = 1 sec 間隔で timeout() シグナルが発せられるようにして self.update_time() メソッドで QLCDNumber クラスのインスタンスの時刻表示を更新しています。

参考サイト

  1. QLCDNumber - Qt for Python
  2. QTimer - Qt for Python
  3. After updating fedora 40 PySide6 in Python it does not work - Fedora Discussion

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ オープンソースへ
にほんブログ村

オープンソース - ブログ村ハッシュタグ
#オープンソース



0 件のコメント: