pyQt5 - process에서 메시지 박스를 보여주는 예제Qt/PyQt5 강좌2024. 4. 14. 21:45
Table of Contents
반응형
process에서 메시지 박스를 보여주는 pyQt5 예제입니다.
2024. 4. 11 최초작성
프로세스에서 UI를 사용할 수 없기 때문에 필요시 메인 윈도우에 요청하여 UI처리를 해야 합니다. 여기에서는 프로세스에서 큐를 사용하여 전달한 메시지를 메인 윈도우에서 메시지 박스에 보여줍니다.
실행 후, 프로세스 시작 버튼을 클릭합니다. 이후 중복 클릭을 방지하기 위해 프로세스 시작 버튼은 비활성화 됩니다.
프로세스에서 전달한 메시지를 메인 윈도우가 메시지 박스에 보여줍니다. 프로세스가 보내는 메시지 타입에는 아래 스크린샷에 보이는 3가지가 있고 랜덤으로 보내도록 했습니다. 프로그램 종료를 물어보는 메시지 박스에서 Yes를 선택하기 전까지 메시지 박스를 랜덤으로 보여주게 됩니다.
No를 누르면 큐에서 다음 메시지를 꺼내서 메시지 박스를 보여주게 되고 Yes를 누르면 프로그램이 종료됩니다.
OK를 누르면 다음 메시지를 큐에서 꺼내 메시지 박스를 보여줍니다.
OK를 누르면 다음 메시지를 큐에서 꺼내 메시지 박스를 보여줍니다.
전체 코드입니다.
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QVBoxLayout, QWidget, QPushButton from multiprocessing import Process, Queue, Event import time import random from datetime import datetime # 프로세스에서 3가지 타입의 메시지를 큐에 삽입하여 메인 윈도우에 전달합니다. def worker(queue, event): count = 0 while not event.is_set(): random_integer = random.randint(1, 3) if random_integer == 1: message = f'현재까지 {count+1}번 반복했습니다.' elif random_integer == 2: now = datetime.now() message = now.strftime("오늘은 %Y년 %m월 %d일이고 현재 시간은 %H시 %M분 %S초입니다.") elif random_integer == 3: message = "프로세스에서 보낸 메시지입니다. 프로그램을 종료하시겠습니까?" else: continue if queue.empty(): count = count + 1 queue.put((random_integer, message)) time.sleep(2) print('stop process') # 큐에 있는 타입에 따라 메시지 박스를 보여줍니다. class MainWindow(QMainWindow): def __init__(self, queue): super().__init__() self.queue = queue self.event = Event() self.initUI() def initUI(self): self.setWindowTitle("Process to GUI") self.setGeometry(100, 100, 200, 100) self.setFixedSize(200,100) self.centralWidget = QWidget() self.setCentralWidget(self.centralWidget) self.layout = QVBoxLayout(self.centralWidget) self.button = QPushButton("프로세스 시작", self) self.button.clicked.connect(self.startProcess) self.layout.addWidget(self.button) self.show() def startProcess(self): self.process = Process(target=worker, args=(self.queue, self.event)) self.process.start() self.button.setEnabled(False) # 중복 실행 방지 self.checkQueue() def checkQueue(self): count = 0 while not self.event.is_set(): if not self.queue.empty(): count = count + 1 type, message = self.queue.get() print(f'{count}번째 type={type}') if type == 1 or type == 2: QMessageBox.information(self, "메시지", message) elif type == 3: reply = QMessageBox.question(self, "메시지", # 타이틀바에 표시되는 메시지 message, # 메시지 박스내에 표시되는 메시지 QMessageBox.Yes | QMessageBox.No, # 보여줄 버튼 QMessageBox.No) # 기본 선택 버튼 if reply == QMessageBox.Yes: print('Yes') self.event.set() self.process.join() self.close() else: print('No') time.sleep(0.5) # 0.5초 대기 if __name__ == "__main__": queue = Queue() app = QApplication(sys.argv) mainWindow = MainWindow(queue) sys.exit(app.exec_()) |
반응형
'Qt > PyQt5 강좌' 카테고리의 다른 글
PyQt5에서 윈도우의 모든 창 버튼(최소화, 최대화, 닫기)을 제거 (0) | 2024.05.21 |
---|---|
PyQT5 - 랜덤 컬러 그리드 생성하기 (0) | 2024.04.17 |
PyQt5 예제 - 단축키로 버튼 누르기 (0) | 2024.04.12 |
PyQtGraph 다른 모니터로 윈도우 이동시 그래프가 깨지는 현상 해결 방법 (0) | 2024.02.21 |
PyQt5 그래프 그리기 - PyQtGraph 예제 (14) | 2024.02.05 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!