HOWTO · Tkinter

如何隱藏、恢復和刪除 Tkinter 控制元件

在本教程中,我們將介紹如何通過單擊按鈕來隱藏,恢復 Tkinter 控制元件。

本頁內容

使用幾何配置管理器的 forget 方法隱藏 Tkinter 控制項時,控制項仍會保留;再次呼叫其幾何配置管理器即可重新顯示。若要永久移除控制項,請使用 destroy();控制項銷毀後,呼叫 pack() 或 grid() 都無法使它恢復。範例使用按鈕回呼控制標籤。若要進一步了解按鈕回呼,請參閱 Tkinter 按鈕指南。

隱藏與恢復 Tkinter 控制項

若使用 pack() 加入控制項,可呼叫 pack_forget() 將它從畫面上移除。控制項本身仍存在,因此可再次呼叫 pack() 顯示它。對於使用 grid 配置的控制項,grid_forget() 會清除已儲存的格線設定,而 grid_remove() 會保留這些設定,供之後呼叫 grid() 時使用。每個控制項應使用一種幾何配置管理器;同一個父控制項中的子控制項,不要混用 pack() 和 grid()。以下範例為每個標籤各自建立一個框架:使用 pack 配置的控制項只在其框架內使用 pack(),使用 grid 配置的控制項則只在其框架內使用 grid()。

這個無頭模式範例會列印三種隱藏與恢復情境所使用的方法。在 Tkinter 視窗中,請將對應的方法呼叫綁定至按鈕;實際圖形介面需要桌面顯示環境。

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 按鈕則示範兩種恢復方式:grid_remove() 會保留原本的列與欄,因此不帶引數的 grid() 回呼即可重新配置;grid_forget() 會清除這些設定,所以對應按鈕會明確指定預期的位置。這些呼叫只會改變各標籤的配置方式,不會銷毀它們。若要進一步了解控制項配置,請參閱 Tkinter 幾何配置管理器。

按一下按鈕永久刪除 Tkinter 控制項

對要移除的控制項呼叫 destroy()。在此範例中,Delete label 按鈕會呼叫 label.destroy,移除的是標籤,而不是按鈕。控制項銷毀後,無法透過幾何配置管理器恢復;如果之後仍需要該控制項,請建立新的標籤。請在支援 Tk 的桌面環境中執行這個 Python 3 範例,再按一下 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()