>  기사  >  백엔드 개발  >  반응형 GUI 애플리케이션을 위해 PyQt에서 QThread를 구현하는 방법은 무엇입니까?

반응형 GUI 애플리케이션을 위해 PyQt에서 QThread를 구현하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-19 09:55:02942검색

How to Implement QThreads in PyQt for Responsive GUI Applications?

PyQt에서 QThreads의 적절한 구현

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 애플리케이션에서 QThreads를 효과적으로 활용하여 장시간 작업 중에도 GUI의 응답성을 유지할 수 있습니다.

위 내용은 반응형 GUI 애플리케이션을 위해 PyQt에서 QThread를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.