Tkinter의 Toplevel 클래스는 메인 윈도우와 별개로 동작하는 자식 창을 생성할 때 사용합니다. Toplevel 창을 만들면 메인 창 위에 새로운 창이 나타나며, 그 안에 배치한 위젯들도 함께 표시됩니다.
다만 기본 상태에서는 사용자가 다른 창을 클릭하는 순간 Toplevel 창이 뒤로 밀려나 포커스를 잃게 됩니다. 이 문제를 해결하려면 grab_set() 메서드를 사용하면 됩니다. 이 메서드를 호출하면 해당 Toplevel 창이 다른 모든 창 위에 항상 머무르며 입력 포커스를 독점하게 되어, 마치 모달 대화상자처럼 동작합니다.
예제 코드
# tkinter 라이브러리 임포트
from tkinter import *
# tkinter 프레임 인스턴스 생성
win = Tk()
win.geometry("700x350")
def open_win():
# 새로운 Toplevel 창 생성
top = Toplevel(win)
top.geometry("700x250")
Label(top, text="안녕하세요!", font=('Helvetica 14 bold')).pack()
# Toplevel 창이 항상 포커스를 유지하도록 설정
top.grab_set()
# 안내 문구를 표시하는 라벨 생성
label = Label(win, text="아래 버튼을 클릭하면 팝업 창이 열립니다", font=('Helvetica 18 bold'))
label.pack(pady=30)
# 팝업 창을 여는 버튼 생성
button = Button(win, text="클릭", command=open_win, font=('Helvetica 14 bold'), foreground='OrangeRed3', background="white")
button.pack(pady=50)
win.mainloop()실행 결과
위 코드를 실행하면 팝업 창을 여는 버튼이 포함된 메인 창이 화면에 나타납니다.

버튼을 클릭하면 새로운 팝업(Toplevel) 창이 열립니다.

grab_set()이 적용되었기 때문에 이 팝업 창은 닫히기 전까지 항상 최상위에 유지되며, 메인 창을 클릭해도 포커스가 빼앗기지 않습니다.
추가 팁
팝업 창을 닫을 때 포커스 제어를 명시적으로 해제하고 싶다면 top.grab_release()를 호출하면 됩니다. 일반적으로 창이 종료(destroy)될 때 자동으로 해제되지만, 코드에 명시해 두면 더욱 안전하게 동작을 보장할 수 있습니다.