반응형
PyQt5 -- QThread 사용하기 & thread 간 통신하기
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class MyMainGUI(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.qtxt1 = QTextEdit(self)
self.btn1 = QPushButton("Start", self)
self.btn2 = QPushButton("Stop", self)
self.btn3 = QPushButton("add 100", self)
self.btn4 = QPushButton("send instance", self)
vbox = QVBoxLayout()
vbox.addWidget(self.qtxt1)
vbox.addWidget(self.btn1)
vbox.addWidget(self.btn2)
vbox.addWidget(self.btn3)
vbox.addWidget(self.btn4)
self.setLayout(vbox)
self.setGeometry(100, 50, 300, 300)
class Test:
def __init__(self):
name = ""
class MyMain(MyMainGUI):
add_sec_signal = pyqtSignal()
send_instance_singal = pyqtSignal("PyQt_PyObject")
def __init__(self, parent=None):
super().__init__(parent)
self.btn1.clicked.connect(self.time_start)
self.btn2.clicked.connect(self.time_stop)
self.btn3.clicked.connect(self.add_sec)
self.btn4.clicked.connect(self.send_instance)
self.th = Worker(parent=self)
self.th.sec_changed.connect(self.time_update) # custom signal from worker thread to main thread
self.add_sec_signal.connect(self.th.add_sec) # custom signal from main thread to worker thread
self.send_instance_singal.connect(self.th.recive_instance_singal)
self.show()
@pyqtSlot()
def time_start(self):
self.th.start()
self.th.working = True
@pyqtSlot()
def time_stop(self):
self.th.working = False
@pyqtSlot()
def add_sec(self):
print(".... add singal emit....")
self.add_sec_signal.emit()
@pyqtSlot(str)
def time_update(self, msg):
self.qtxt1.append(msg)
@pyqtSlot()
def send_instance(self):
t1 = Test()
t1.name = "SuperPower!!!"
self.send_instance_singal.emit(t1)
class Worker(QThread):
sec_changed = pyqtSignal(str)
def __init__(self, sec=0, parent=None):
super().__init__()
self.main = parent
self.working = True
self.sec = sec
# self.main.add_sec_signal.connect(self.add_sec) # 이것도 작동함. # custom signal from main thread to worker thread
def __del__(self):
print(".... end thread.....")
self.wait()
def run(self):
while self.working:
self.sec_changed.emit('time (secs):{}'.format(self.sec))
self.sleep(1)
self.sec += 1
@pyqtSlot()
def add_sec(self):
print("add_sec....")
self.sec += 100
@pyqtSlot("PyQt_PyObject")
def recive_instance_singal(self, inst):
print(inst.name)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
form = MyMain()
app.exec_()
---
반응형
'PyQt5' 카테고리의 다른 글
PyQt5 -- QCalendarWidget 으로 달력에 공휴일 표시하기 (0) | 2017.09.17 |
---|---|
PyQt5 -- QTableWidget 사용 고급 예제 ; checkbox 넣기, 숫자나 widget으로 정렬, checked row 구하기 (2) | 2017.07.18 |
PyQt5 -- singal & slot 으로 객체 등 보내기 (0) | 2017.06.30 |
PyQt5 -- context menu 사용법 3가지 (QTableWidget 사용함) (0) | 2017.05.05 |
PyQt5 -- QTableWidget 사용하기 (6) | 2017.05.02 |