見出し画像

PyQt系ライブラリでwidgetの動的変化が出来ない問題の解決方法

PyQt系ライブラリの、ライセンスフリーであるPyside6を使用したときに気付いたことを備忘録的に書いています。


widgetの動的変化を行う方法は二つあり、

  • 作成した関数の終了時に更新され、動的変化する

  • QApplication.processEvents()を呼び出して動的変化する

の二種類があります。
setText()等を呼び出しただけだとwidgetの更新が出来ないのが厄介な点ですが、これで解決することは出来ます。
まあ、正直PythonでGUIを作るならcustomtkinter、flet等を使った方が楽だと思いますが…

コード例を以下に置いておきます。

from PySide6.QtWidgets import QApplication, QPushButton, QVBoxLayout, QLabel, QWidget
from PySide6.QtGui import Qt
import time

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        #ウィジェットの呼び出し
        self.SetLabel()
        self.SetButton()

        #縦向きにウィジェットを配置
        vlayout = QVBoxLayout(self)
        vlayout.addWidget(self.label)
        vlayout.addWidget(self.button)

        #ラベルの動作を設定
    def SetLabel(self):
        self.label = QLabel('おはようございます', self)
        self.label.setAlignment(Qt.AlignCenter)
        self.label.setStyleSheet("QLabel {font-size: 24px;}")

        #ボタンの動作を設定
    def SetButton(self):
        self.button = QPushButton('文字を変える', self)
        self.button.clicked.connect(self.change_text)

        #setTextでウィジェットの文字を変更
        #processEventsもしくは関数終了時にウィンドウを更新
    def change_text(self):
        self.button.setText('文字が変わりました')
        self.label.setText('おやすみなさい')

        QApplication.processEvents()
        time.sleep(1)

        self.button.setText('文字が戻りました')
        self.label.setText('おはようございます')


if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()


「文字を変える」を押すと…
processEvents()が呼び出され文字が変化する
一秒経過後、関数終了時の更新で文字が変化する

記事は以上です。
また何か書きたくなったら適当に書きます。

いいなと思ったら応援しよう!