대화 상자(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()실행 결과
위 코드를 실행하면 대화 상자를 열 수 있는 버튼이 포함된 메인 창이 화면에 나타납니다.

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

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