본문 바로가기

Python

PySide6 에서 윈도우 종료시 다시 한번 확인하기

가끔 윈도우 프로그램에서 상단의 종료버튼을 누르면, 그때 한번 더 확인할 필요가 있을 때가 있다. 

이게 알면 간단한데, 모르면 어떻게 구현해야 하나? 하는 막막한 기능이다. 

 

그러니, 먼저 챗지피티에게 종료여부 확인 기능에 대해서 물어보자. 

 

쳇지피티야~ 알려줘.

 

그랬더니 아래와 같은 코드를 알려준다. 

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox

class MainWindow(QMainWindow):
    def closeEvent(self, event):
        reply = QMessageBox.question(self, "종료 확인", "정말로 종료하시겠습니까?",
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        
        if reply == QMessageBox.Yes:
            event.accept()  # 종료 허용
        else:
            event.ignore()  # 종료 취소

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.setWindowTitle("종료 확인 예제")
    window.resize(400, 300)
    window.show()
    sys.exit(app.exec())

 

흠.. 언제나 그렇지만, 한번 실제로 잘 되는지 확인해보자. 

 

실제 파일을 만들고, 실행해보면 아래와 같은 창이 생성된다. 

일단 이런 빈 창이 뜨는데...

 

우측 상단에 종료버튼을 누르면!!!

윈도우 종료버튼을 누르면, 다시 한번 종료확인을 하는 창이 뜬다. 

윈도우 종료버튼을 누르면, 이렇게 다시 한번 종료여부를 묻는다

 

코드를 다시 한번 자세히 보자. 

위 기능의 핵심은 closeEvent()를 override 해서 event를 받아온 후, QMessageBox를 이용해서 확인 창을 띄우고, 그 확인창의 reply를 받아와서 그 값에 다라서 event.accept() 와 event.ignore()를 수행하는 것이다. 

    def closeEvent(self, event):
        reply = QMessageBox.question(self, "종료 확인", "정말로 종료하시겠습니까?",
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        
        if reply == QMessageBox.Yes:
            event.accept()  # 종료 허용
        else:
            event.ignore()  # 종료 취소

 

어찌보면 간단한 기능인데, 이거 생각보다 구글에서 쌩으로 검색하려면 쉽게 안나온다. 

 

쳇지피티야, 오늘도 수고했어!!

그럼 여기까지... 이지만, 살짝 사족을 붙이면, 

 

사실 원래 하려던 것은, 그래프를 그리고, 메인 윈도우를 종료할 때 종료여부를 다시 한번 확인하는 기능이었다. 그래서 처음에는 아래처럼 물어봤었다. 

쳇지피티야, 알려줘~

그랬더니 쳇지피티는 아래처럼 잘 알려주었다. 

저렇게 물어봐도 잘 알려주는 구나~

그리고 이때의 코드는 아래와 같이 알려주었다. 

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox
import pyqtgraph as pg

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PySide6 + pyqtgraph Example")
        self.setGeometry(100, 100, 800, 600)

        # pyqtgraph PlotWidget 추가
        self.plot_widget = pg.PlotWidget()
        self.setCentralWidget(self.plot_widget)
        self.plot_example()

    def plot_example(self):
        x = list(range(100))
        y = [i**0.5 for i in x]  # 간단한 제곱근 그래프
        self.plot_widget.plot(x, y, pen=pg.mkPen(color='b', width=2))

    def closeEvent(self, event):
        reply = QMessageBox.question(self, '종료 확인', '정말 종료하시겠습니까?',
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

 

그런데 코드를 자세히 보니... PySide6 와 PyQtGraph부분이 분리되어 있다. 즉, PySide6 부분에서 윈도우 창을 관리하고 pyqtgraph 에서는 그래프를 그리는 역할만 하도록 되어 있다. 그말은 PySide6와 PyQtGraph 가 같이 있을 필요가 없다는 말이다. 

 

그래서 질문자체를 PyQtGraph 를 빼고, 'PySide6 에서 윈도우 ~~~' 형태로 바꾸었다. 

 

이 부분의 요지는, 쳇지피티에게 약간 질문을 이상하게 물어봐도 잘 엮어서 대답을 해준다는 것이다. 다만, 답변에서 정말 중요한 부분을 뽑아내는 것은 본인의 능력이라고 볼 수 있다. 

 

모두들 쳇지피티도 잘 활용하고, 동시에 본인의 능력도 그와 함께 향상시키길 바란다. 

 

그럼 진짜 이만~~