Python | GUIアプリの応答なしをスレッド処理で対策

GUI App

Python GUIアプリの応答なしをスレッド処理で対策する方法を説明する。

イメージ図

応答なしになってしまうパターン

重い処理をしている間に「応答なし」になってしまう。

他のスレッドを使い応答なしを回避

重い処理を他のスレッドに実行させることで応答なしを回避できる。

具体例

GUIアプリで重い処理(10秒数える)処理を行った場合を例に対策前後の挙動を示す。

対策前

自分のスレッドで重い処理(10秒数える)を行うと、その間応答無しになってしまう。

対策後

他のスレッドで重い処理(10秒数える)を実行させることにより応答無しにならない。

他のスレッドで処理させるための方法

他のスレッドに処理させたい関数をthreading.Thread()で呼び出してstart()する。

        self.thread = threading.Thread(target=スレッド処理したい関数)
        self.thread.start()

    def スレッド処理したい関数(self):

参考:引数が有る場合はこのように記述する。

        self.thread = threading.Thread(target=スレッド処理したい関数, args=[引数])
        self.thread.start()

    def スレッド処理したい関数(self, 引数):

コード全文

#!/usr/bin/env python3

from PyQt6.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit, QPushButton)
import sys
import threading
import time


class GuiWindow(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setGeometry(100,0,260,230)
        self.build_ui()
        self.connect_signal_slot()
        self.show()

    def build_ui(self):
        self.ラベル = QLabel('', self)
        self.ボタン1 = QPushButton('自分のスレッドで10秒数える', self)
        self.ボタン2 = QPushButton('他のスレッドで10秒数える', self)
        self.入力欄 = QLineEdit('',self)

        self.ラベル.setGeometry(30, 10, 200, 30)
        self.ボタン1.setGeometry(30, 40, 200, 30)
        self.ボタン2.setGeometry(30, 70, 200, 30)
        self.入力欄.setGeometry(30, 120, 200, 70)

    def connect_signal_slot(self):
        self.ボタン1.clicked.connect(self.button1_clicked)
        self.ボタン2.clicked.connect(self.button2_clicked)

    def button1_clicked(self):
        self.数を10秒数える()

    def button2_clicked(self):
        self.thread = threading.Thread(target=self.数を10秒数える)
        self.thread.start()

    def 数を10秒数える(self):
        for x in range(10):
            self.ラベル.setText(str(x))
            time.sleep(1)
        self.ラベル.setText('完了')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = GuiWindow()
    sys.exit(app.exec())

まとめ

応答なし 応答させちゃえ ホトトギス

コメント