프로그래밍/Python

[Python] PyQt5 - askyesno, showerror, showinfo 대체하기

채윤아빠 2023. 7. 10. 15:20
728x90
반응형

문제점

"tkinter.messagebox" 내의 askyesno, showerror, showinfo 함수들을 이용하여 메시창 알림을 잘 사용하고 있었습니다.

from tkinter.messagebox import askyesno, showerror, showinfo

그런데 메시지 창이 나타나는 위치가 항상 화면에 중간에만 나타나는 문제가 있었습니다.

알림 메시지 창이 해당 함수를 호출하는 창의 중앙에 위치하도록 변경해야 했습니다.

parent 매개변수에 부모 객체를 넘겨주면 부모 컨트롤의 중앙에 표시될 것이라는 글을 보고 적용해 보았으나 오류가 발생하였습니다.


해결 과정

"Tkinter, tkmessagebox keeps sending me to the root":https://stackoverflow.com/questions/16307243/ 에 관련 내용이 있어서, "parent = widget"과 같이 매개변수를 추가하여 실행하였더니, 다음과 같은 오류가 발생하였습니다.

    showerror('작업 진행중 오류', error_message, parent = self)
  File "C:\Dev\Python\Python310\lib\tkinter\messagebox.py", line 98, in showerror
    return _show(title, message, ERROR, OK, **options)
  File "C:\Dev\Python\Python310\lib\tkinter\messagebox.py", line 76, in _show
    res = Message(**options).show()
  File "C:\Dev\Python\Python310\lib\tkinter\commondialog.py", line 45, in show
    s = master.tk.call(self.command, *master._options(self.options))
AttributeError: 'TestProgressDialog' object has no attribute 'tk'. Did you mean: 'tr'?

"tkinter.messagebox" 관련 예제들을 보면, Qt와는 다른 방식으로 창을 생성하는 방식이라, 혼용해서 쓰면 안된다는 것을 알게 되었습니다. ^^;

Qt에서는 당연하게도 QMessageBox를 이용합니다.


askyesno, showerror, showinfo 대체 함수 작성

그런데, 이미 askyesno, showerror, showinfo 함수들로 작성된 코드들이 넘쳐 나서, 일일이 모두 QMessageBox로 변경하기가 귀찮기도 하고 해서, 다음과 같이 함수 이름만 동일하게 대체 함수들을 작성하여 적용하였습니다.

askyesno 대체 함수

def askyesno(parent: QWidget, title: str, message: str) -> bool:
    """ 예/아니오 질의 대화상자를 표시합니다.

    Args:
        parent (QWidget): 부모창 객체
        title (str): 대화상자 캡션에 표시될 제목
        message (str): 대화상자 메시지 내용

    Returns:
        bool: 예를 선택하면 True, 그렇지 않으면 False를 반환합니다.
    """
    ret = QMessageBox.question(parent, title, message, QMessageBox.StandardButton.YesQMessageBox.StandardButton.No
            , QMessageBox.StandardButton.No)
    return (ret == QMessageBox.StandardButton.Yes)

showerror 대체 함수

def showerror(parent: QWidget, title: str, message: str) -> None:
    """ 오류 대화상자를 표시합니다.

    Args:
        parent (QWidget): 부모창 객체
        title (str): 대화상자 캡션에 표시될 제목
        message (str): 대화상자 메시지 내용
    """
    QMessageBox.critical(parent, title, message, QMessageBox.StandardButton.Close)

showinfo 대체 함수

def showinfo(parent: QWidget, title: str, message: str) -> None:
    """ 정보 대화상자를 표시합니다.

    Args:
        parent (QWidget): 부모창 객체
        title (str): 대화상자 캡션에 표시될 제목
        message (str): 대화상자 메시지 내용
    """
    QMessageBox.information(parent, title, message, QMessageBox.StandardButton.Close)

단지 "tkinter.messagebox"과 차이라면 차이가 "tkinter.messagebox"에서 표시한 안내창에서는 버튼이 한글로 나오지만, QMessageBox 에서 표시한 안내창에서는 각 버튼이 영문으로 표시된다는 점입니다.

QMessageBox 에서도 버튼이 한글로 나오게 하는 방법은 다음에 기회가 되면 다루어 보도록 하겠습니다.


참고자료