ホームページ > バックエンド開発 > Python チュートリアル > レスポンシブ GUI アプリケーション用に PyQt に QThreads を実装するにはどうすればよいですか?

レスポンシブ GUI アプリケーション用に PyQt に QThreads を実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-19 09:55:02
オリジナル
1032 人が閲覧しました

How to Implement QThreads in PyQt for Responsive GUI Applications?

PyQt での QThread の適切な実装

PyQt Gui アプリケーションでは、GUI の応答性を維持するために、長い操作を別のスレッドに分離することが望ましいことがよくあります。ただし、質問で言及されている参照に従って、 run メソッドを再実装することはお勧めできません。

Python での正しいアプローチを示すために、GUI とワーカー スレッド間の通信にシグナルとスロットを利用する次の例を検討してください。 :

  1. ワーカー スレッドの作成: ワーカー オブジェクトを初期化し、開始する別のスレッドに移動します。
  2. 信号とスロットの接続: ステータス更新のためにワーカーと GUI オブジェクトの間のシグナルおよびスロット接続を確立します。
  3. ワーカー スレッドの開始: [開始] ボタンをクリックすると、GUI はワーカー スレッドに次の信号を送ります。計算を開始します。
  4. ワーカー スレッドのキャンセル: 必要に応じて、[キャンセル] ボタンをクリックすると、ワーカー スレッドが強制的に終了され、新しいワーカー スレッドが作成されます。

は次のとおりです。コード実装:

<code class="python">from PyQt4 import QtGui, QtCore
import sys
import random

class Example(QtCore.QObject):

    signalStatus = QtCore.pyqtSignal(str)

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

        self.gui = Window()
        self.createWorkerThread()
        self._connectSignals()

        self.gui.show()

    def _connectSignals(self):
        self.gui.button_cancel.clicked.connect(self.forceWorkerReset)
        self.signalStatus.connect(self.gui.updateStatus)
        self.parent().aboutToQuit.connect(self.forceWorkerQuit)

    def createWorkerThread(self):
        self.worker = WorkerObject()
        self.worker_thread = QtCore.QThread()
        self.worker.moveToThread(self.worker_thread)
        self.worker_thread.start()

        self.worker.signalStatus.connect(self.gui.updateStatus)
        self.gui.button_start.clicked.connect(self.worker.startWork)

    def forceWorkerReset(self):
        if self.worker_thread.isRunning():
            print('Terminating thread.')
            self.worker_thread.terminate()

            print('Waiting for thread termination.')
            self.worker_thread.wait()

            self.signalStatus.emit('Idle.')

            print('building new working object.')
            self.createWorkerThread()

    def forceWorkerQuit(self):
        if self.worker_thread.isRunning():
            self.worker_thread.terminate()
            self.worker_thread.wait()

class WorkerObject(QtCore.QObject):

    signalStatus = QtCore.pyqtSignal(str)

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

    @QtCore.pyqtSlot()
    def startWork(self):
        for ii in range(7):
            number = random.randint(0, 5000**ii)
            self.signalStatus.emit('Iteration: {}, Factoring: {}'.format(ii, number))
            factors = self.primeFactors(number)
            print('Number: ', number, 'Factors: ', factors)
        self.signalStatus.emit('Idle.')

    def primeFactors(self, n):
        i = 2
        factors = []
        while i * i <= n:
            if n % i:
                i += 1
            else:
                n //= i
                factors.append(i)
        if n > 1:
            factors.append(n)
        return factors

class Window(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.button_start = QtGui.QPushButton('Start', self)
        self.button_cancel = QtGui.QPushButton('Cancel', self)
        self.label_status = QtGui.QLabel('', self)

        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.button_start)
        layout.addWidget(self.button_cancel)
        layout.addWidget(self.label_status)

        self.setFixedSize(400, 200)

    @QtCore.pyqtSlot(str)
    def updateStatus(self, status):
        self.label_status.setText(status)


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    example = Example(app)
    sys.exit(app.exec_())</code>
ログイン後にコピー

このアプローチに従うことで、PyQt アプリケーションで QThread を効果的に利用でき、長時間の操作中でも GUI の応答性を維持できます。

以上がレスポンシブ GUI アプリケーション用に PyQt に QThreads を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート