Python (파이썬)/PyQT

[PyQT5] Thread 사용하기 (QThread, 간단한 예제)

건강한 지서기 2023. 4. 4. 14:57

PyQT를 사용할 때 너무 긴 시간이 소요되는 연산을 수행하게 되면 UI가 멈추게 된다.
 
이때 쓰레딩을 사용해서 해결해야 한다는 생각이 들어도 고생을 하게 되는데
pyqt나 pyside을 사용할 때는 일반적으로 python에서 하듯 threading 하게 되면 의도한 데로 작동하지 않기 때문이다.
 
그렇기 때문에 QThread class를 사용해서 thread를 구성해야 한다.
 

예제

일단 Qt designer를 이용해서 다음과 같이 ui를 제작해 보았다.

위에서 Progress bar는 Thread를 통해 1초마다 1% 씩 증가시킬 거고
그동안 사용자가 Summit을 클릭하면 Label의 텍스트가 변경되는 프로그램을 만들 것이다.
 

import sys
import time

from PyQt5 import uic
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow

form_class = uic.loadUiType("main_ui.ui")[0]
class main_window(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.thread = example_thread()

        # start()를 통해 run()을 시작
        self.thread.start()
        self.thread.progress.connect(self.progressBar.setValue)
        # line edit에 있는 text를 label에 넣는다.
        self.pushButton.clicked.connect(self.set_label_text)

    def set_label_text(self):
        self.label.setText(self.lineEdit.text())

class example_thread(QThread):
    progress = pyqtSignal(int)
    def __init__(self):
        super().__init__()

    def run(self):
        # 1초마다 progress bar의 value를 1씩 증가시킨다.
        value = 0
        while True:
            value += 1
            if value > 100:
                value = 0
            self.progress.emit(value)
            time.sleep(1)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWindow = main_window()
    myWindow.show()
    app.exec_()

 

예제 결과

 
https://github.com/geesk/pyqt5_thread_example