Tkinter는 사용자가 직접 정의할 수 있는 커스텀 핸들러(custom handler)를 통해 창 닫기 이벤트를 처리할 수 있습니다. 이 핸들러는 일종의 콜백 함수로 동작하며, 호출되는 순간 해당 윈도우를 종료시키는 역할을 합니다.
창을 닫을 때 핵심이 되는 메서드는 바로 destroy()입니다. 이 메서드는 어떤 함수나 위젯 안에서 호출하든 즉시 해당 윈도우를 강제로 종료합니다. 아래에서는 destroy() 메서드를 활용해 닫기 이벤트 핸들러를 구현하는 두 가지 방법을 살펴보겠습니다.
1. 위젯의 command 인자에 직접 전달하기
버튼 위젯을 생성할 때 command 옵션에 win.destroy를 그대로 넘기면, 버튼 클릭 시 별도의 함수 정의 없이 곧바로 창이 닫힙니다.
예제 코드
# 필요한 라이브러리 임포트
from tkinter import *
# tkinter 프레임(윈도우) 인스턴스 생성
win = Tk()
# 윈도우 크기 설정
win.geometry("600x400")
# 버튼 생성 후 command에 win.destroy를 함수처럼 전달
my_button = Button(win, text="X", font=('Helvetica bold', 20),
borderwidth=2, command=win.destroy)
my_button.pack(pady=20)
win.mainloop()2. 함수 내부에서 호출하기
닫기 로직에 추가 작업(예: 저장 확인, 알림 표시 등)이 필요하다면, 별도의 함수를 정의하고 그 안에서 destroy()를 호출하는 방식이 더 유용합니다.
예제 코드
# 필요한 라이브러리 임포트
from tkinter import *
# tkinter 프레임(윈도우) 인스턴스 생성
win = Tk()
# 윈도우 크기 설정
win.geometry("600x300")
# 창을 닫는 함수 정의
def close():
win.destroy()
# 버튼 생성 후 command에 함수 이름 전달
my_button = Button(win, text="X", font=('Helvetica bold', 20),
borderwidth=2, command=close)
my_button.pack(pady=20)
win.mainloop()실행 결과
위 코드를 실행하면 화면에 "X"라는 텍스트를 가진 버튼이 나타나고, 해당 버튼을 클릭하면 메인 윈도우가 즉시 종료됩니다.

참고: 윈도우 우측 상단 X 버튼 이벤트 가로채기
만약 운영체제가 제공하는 기본 닫기 버튼(윈도우 제목 표시줄의 X)을 눌렀을 때 특정 동작을 수행하고 싶다면, protocol("WM_DELETE_WINDOW", 콜백함수)를 사용하면 됩니다.
def on_closing():
print("창을 닫습니다.")
win.destroy()
win.protocol("WM_DELETE_WINDOW", on_closing)
win.mainloop()이 방법을 활용하면 사용자가 창을 닫기 전에 확인 대화상자를 띄우거나, 데이터를 자동으로 저장하는 등의 후속 처리를 손쉽게 구현할 수 있습니다.