Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 tkinter로 모달 대화 상자(Modal Dialog) 만드는 방법

대화 상자(Dialog Box)는 사용자와 애플리케이션 인터페이스 사이의 상호작용을 담당하는 핵심 요소입니다. 확인 메시지, 경고 알림, 입력 요청 등 다양한 용도로 활용되며, tkinter에서는 Toplevel 윈도우와 여러 위젯을 조합하여 손쉽게 만들 수 있습니다.

Toplevel 윈도우는 기존의 모든 창보다 위에 표시되기 때문에, 이곳에 라벨이나 버튼 같은 위젯을 추가하면 자연스럽게 대화 상자 형태를 구성할 수 있습니다. 특히 모달(Modal) 대화 상자는 사용자가 응답을 마칠 때까지 메인 작업 흐름을 제어할 수 있어, 확인 절차가 필요한 기능에 적합합니다.

예제 구성

이번 예제에서 만들 모달 대화 상자는 다음과 같은 단계로 구현합니다.

  • Toplevel 윈도우 초기화
  • 팝업 대화 상자를 띄우는 이벤트 함수 정의
  • Toplevel 윈도우에 위젯 추가
  • 대화 상자의 선택 옵션을 처리하는 함수 정의
# 필요한 라이브러리 임포트
from tkinter import *
from tkinter import ttk

# tkinter 프레임 인스턴스 생성
win = Tk()

# 윈도우 크기 설정
win.geometry("700x350")
style = ttk.Style()
style.theme_use('clam')

# 선택 결과를 처리하는 함수 정의
def choice(option):
    pop.destroy()
    if option == "yes":
        label.config(text="Hello, How are You?")
    else:
        label.config(text="You have selected No")
        win.destroy()

def click_fun():
    global pop
    pop = Toplevel(win)
    pop.title("Confirmation")
    pop.geometry("300x150")
    pop.config(bg="white")
    # 라벨 텍스트 생성
    label = Label(pop, text="Would You like to Proceed?",
    font=('Aerial', 12))
    label.pack(pady=20)
    # 버튼을 담을 프레임 추가
    frame = Frame(pop, bg="gray71")
    frame.pack(pady=10)
    # 선택용 버튼 추가
    button1 = Button(frame, text="Yes", command=lambda: choice("yes"), bg="blue", fg="white")
    button1.grid(row=0, column=1)
    button2 = Button(frame, text="No", command=lambda: choice("no"), bg="blue", fg="white")
    button2.grid(row=0, column=2)

# 메인 창에 라벨 위젯 생성
label = Label(win, text="", font=('Aerial', 14))
label.pack(pady=40)

# 대화 상자를 여는 버튼 생성
ttk.Button(win, text="Click Here", command=click_fun).pack()

win.mainloop()

실행 결과

위 코드를 실행하면 대화 상자를 열 수 있는 버튼이 포함된 메인 창이 화면에 나타납니다.

파이썬 tkinter로 모달 대화 상자(Modal Dialog) 만드는 방법

버튼을 클릭하면 모달 대화 상자가 열립니다. "Yes"를 선택하면 메인 창에 인사 메시지가 표시되고, "No"를 선택하면 안내 문구와 함께 프로그램이 종료됩니다.

파이썬 tkinter로 모달 대화 상자(Modal Dialog) 만드는 방법

추가 팁

모달 동작을 더욱 엄격하게 만들고 싶다면 pop.transient(win)으로 부모 창과의 관계를 지정하고, pop.grab_set()으로 입력 포커스를 팝업 창에 고정하며, pop.focus_set()으로 초기 포커스를 설정하는 방법을 함께 사용해 보세요. 이렇게 하면 사용자가 대화 상자에 응답하기 전까지 메인 창을 조작할 수 없게 됩니다.