반응형
이번에는 QThread 사용법이다.
다른 언어에서도 다 사용하듯 1개의 쓰레드로 모든 기능을 처리한다는 것은 불가능에 가깝다.
특히나 UI가 있다면 더더욱.. (프리징현상 어쩔꺼야...)
그리하여 이번엔 QTthread이다.
정말 간단한 예제이며
QT에서는 QThread말고 QRunnable 등 다른 여러가지 Thread 사용법들이 있다..
차차 하나씩 알아보고 이번엔 간단한 QThread만 알아보도록 하자
from PySide6.QtCore import *
from PySide6.QtWidgets import *
import sys
import time
# 내 돈
balance = 100
# 돈을 1씩 계속 없애는 QThread
class Balance_decrease(QThread):
# Custom Signal 생성
UpdateBalance = Signal()
# QThread의 주 함수
def run(self):
# 내 돈을 Global에서 가져온다.
global balance
# 무한 루프
while True:
# 내 돈을 1원씩 계속 없앤다
balance -= 1
# 없애고 난 돈을 Emit(이벤트 발생)한다.
self.UpdateBalance.emit()
# 1초 대기
time.sleep(1)
# 메인 윈도우
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# 내 돈 표출할 레이블 하나 추가
self.lbl = QLabel(str(balance))
# 쓰레드 호출 버튼
self.btn1 = QPushButton("FIRE")
# 버튼 선택 시 함수 연결
self.btn1.clicked.connect(self.btn1_clicked)
# UI 설정
self.layout = QHBoxLayout()
self.layout.addWidget(self.lbl)
self.layout.addWidget(self.btn1)
self.setLayout(self.layout)
def btn1_clicked(self):
try:
# 쓰레드 클래스 선언
x = Balance_decrease(self)
# 내 돈에 대한 이벤트 호출 시 함수 연결
x.UpdateBalance.connect(self.lbl_update)
# 쓰레드 클래스 시작!
x.start()
except KeyboardInterrupt:
print("KeyboardInterrupt")
def lbl_update(self):
# 내 돈 표출
self.lbl.setText(str(balance))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec()
그렇게까지 어려운 코드가 아니라 다들 이해할 거라 생각함..
주로 봐야할 부분은 Signal 선언하고 emit하는 부분과 connect로 연결하는 부분이다.
(PySide6은 Signal, PyQT5는 pyqtSignal로 선언)
이부분만 보면 Custom Event를 알 수 있을테고..
QTthread는 클래스 생성 시 QThread를 상속받고 run 함수에 특정 기능을 넣는다 정도 하면 될 것 같다.
반응형