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_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()