HOWTO · Tkinter

Tkinter 위젯 숨기기, 복구 및 삭제 방법

이 학습서는 단추를 클릭하여 Tkinter 위젯을 숨기고 복구하고 삭제하는 방법을 보여줍니다.

이 페이지의 내용

Tkinter 위젯을 계속 사용할 수 있도록 숨기려면 geometry manager의 forget 메서드를 호출하고, 다시 표시할 때는 해당 geometry manager를 다시 호출합니다. 위젯을 영구적으로 제거하려면 destroy()를 사용하세요. 이미 제거된 위젯은 pack()이나 grid()를 호출해도 되살릴 수 없습니다. 예제에서는 버튼 콜백으로 레이블을 제어합니다. 버튼 콜백에 관한 자세한 내용은 Tkinter 버튼 가이드를 참고하세요.

Tkinter 위젯 숨기기 및 복구

pack()으로 추가한 위젯을 화면에서 숨기려면 pack_forget()을 호출합니다. 위젯 자체는 계속 존재하므로 pack()을 호출하면 다시 표시할 수 있습니다. grid()로 배치한 위젯에서는 grid_forget()이 저장된 그리드 설정을 지우지만, grid_remove()는 나중에 grid()를 호출할 때 쓸 수 있도록 설정을 보존합니다. 각 위젯에는 하나의 geometry manager만 사용하세요. 같은 부모를 공유하는 위젯들 사이에서 pack()과 grid()를 섞어 쓰면 안 됩니다. 아래 예제에서는 각 레이블을 별도의 프레임에 넣습니다. pack()으로 관리하는 컨트롤은 해당 프레임 안에서 pack()을 사용하고, grid()로 관리하는 컨트롤도 자기 프레임 안에서만 grid()를 사용합니다.

이 헤드리스 예제는 숨기고 복구하는 세 가지 경우에 사용할 메서드를 출력합니다. Tkinter 창에서는 해당 메서드 호출을 버튼에 연결할 수 있으며, 실제 GUI를 사용하려면 데스크톱 디스플레이가 필요합니다. 예제 코드와 출력 블록의 문구는 바이트 동일성을 위해 영어로 유지됩니다.

methods = (
    ("hide a packed widget", "pack_forget()"),
    ("show a packed widget", "pack()"),
    ("hide and later restore grid placement", "grid_remove() then grid()"),
    ("hide and specify grid placement again", "grid_forget() then grid(row=0, column=0)"),
)

for task, method in methods:
    print(f"{task}: {method}")
hide a packed widget: pack_forget()
show a packed widget: pack()
hide and later restore grid placement: grid_remove() then grid()
hide and specify grid placement again: grid_forget() then grid(row=0, column=0)

이 Python 3 예제는 실제 Tkinter 버튼을 만들고, 각 버튼을 버튼에 적힌 레이블 작업에 연결합니다. 창을 사용하려면 Tk를 지원하는 데스크톱 환경에서 실행하세요. 버튼에 표시되는 문구는 바이트 동일성을 위해 예제 안에서 영어로 유지됩니다.

import tkinter as tk

try:
    root = tk.Tk()
except tk.TclError:
    print("This example needs a desktop display with Tk support.")
    raise SystemExit(0)
root.title("Hide and recover labels")

pack_frame = tk.Frame(root, padx=8, pady=8)
pack_frame.pack(fill="x")
pack_label = tk.Label(pack_frame, text="Packed label")
pack_label.pack()
tk.Button(pack_frame, text="Hide packed label", command=pack_label.pack_forget).pack()
tk.Button(pack_frame, text="Show packed label", command=pack_label.pack).pack()

grid_frame = tk.Frame(root, padx=8, pady=8)
grid_frame.pack(fill="x")
grid_label = tk.Label(grid_frame, text="Grid label")
grid_label.grid(row=0, column=0, padx=4)
tk.Button(grid_frame, text="Hide and retain grid options", command=grid_label.grid_remove).grid(row=0, column=1, padx=4)
tk.Button(grid_frame, text="Restore retained grid options", command=grid_label.grid).grid(row=1, column=0, padx=4)
tk.Button(
    grid_frame,
    text="Forget grid options",
    command=grid_label.grid_forget,
).grid(row=1, column=1, padx=4)
tk.Button(
    grid_frame,
    text="Restore at row 0, column 0",
    command=lambda: grid_label.grid(row=0, column=0, padx=4),
).grid(row=2, column=0, columnspan=2, pady=4)

root.mainloop()

pack()으로 배치한 레이블의 버튼은 같은 레이블에 pack_forget()과 pack()을 호출합니다. 그리드 버튼은 두 가지 복구 방식을 보여 줍니다. grid_remove()는 원래 행과 열을 보존하므로 인자 없는 grid() 콜백으로 복구할 수 있습니다. 반면 grid_forget()은 이 설정을 지우므로 해당 버튼은 원하는 배치 정보를 명시적으로 전달합니다. 이 호출들은 레이블을 제거하지 않고 배치 방식만 바꿉니다. 위젯 배치에 관한 자세한 내용은 Tkinter geometry manager 안내를 참고하세요.

버튼을 클릭해 Tkinter 위젯 영구적으로 제거하기

제거할 위젯에 destroy()를 호출합니다. 이 예제에서는 Delete label 버튼이 label.destroy를 호출하므로 버튼이 아니라 레이블이 제거됩니다. 한 번 제거된 위젯은 geometry manager로 복구할 수 없습니다. 나중에 다시 필요하다면 새 레이블을 만들어야 합니다. 이 Python 3 예제를 Tk를 지원하는 데스크톱 환경에서 실행한 다음 Delete label을 클릭하면 창에서 레이블이 제거됩니다. 버튼에 표시되는 Delete label 문구는 바이트 동일성을 위해 영어로 유지됩니다.

import tkinter as tk

try:
    root = tk.Tk()
except tk.TclError:
    print("This example needs a desktop display with Tk support.")
    raise SystemExit(0)
root.title("Destroy a label")

label = tk.Label(root, text="This label will be removed")
label.pack(padx=8, pady=8)
tk.Button(root, text="Delete label", command=label.destroy).pack(padx=8, pady=8)

root.mainloop()