HOWTO · Tkinter
Como esconder, recuperar e excluir widgets Tkinter
Este tutorial demonstra como ocultar, recuperar e excluir widgets Tkinter, clicando em um botão.
Nesta página
Use o método forget do gerenciador de geometria para ocultar um widget Tkinter sem deixar de mantê-lo disponível; chame novamente o gerenciador para exibi-lo. Use destroy() quando quiser remover o widget permanentemente; chamar pack() ou grid() não recupera um widget destruído. Os exemplos usam callbacks de botões para controlar um rótulo. Consulte o guia de botões Tkinter para saber mais sobre callbacks de botões.
Ocultar e restaurar widgets Tkinter
Se um widget foi adicionado com pack(), chame pack_forget() para removê-lo da tela. O widget continua existindo, então pack() pode exibi-lo novamente. Para widgets gerenciados por grade, grid_forget() descarta as configurações salvas da grade, enquanto grid_remove() as mantém para uma chamada posterior a grid(). Use um único gerenciador de geometria para cada widget; não misture pack() e grid() entre widgets que compartilham o mesmo elemento pai. O exemplo abaixo coloca cada rótulo em seu próprio quadro: os controles gerenciados por pack() usam esse método, e os gerenciados por grade usam grid() somente dentro do respectivo quadro.
Este exemplo sem interface gráfica imprime as opções de método para os três casos de ocultação e restauração. Em uma janela Tkinter, associe as chamadas de método correspondentes a botões; a interface gráfica precisa de uma tela de computador para funcionar.
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)
Este exemplo em Python 3 cria botões Tkinter reais. Os rótulos visíveis dos botões permanecem em inglês; cada rótulo em inglês indica a operação aplicada ao widget de rótulo. Execute o exemplo em uma sessão de computador com suporte ao Tk para usar a janela.
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()
Os botões do rótulo gerenciado por pack() chamam pack_forget() e pack() nesse mesmo rótulo. Os botões da grade demonstram as duas opções de restauração: grid_remove() mantém a linha e a coluna originais para o callback grid() sem argumentos, enquanto grid_forget() apaga essas opções, por isso o botão correspondente informa explicitamente a posição desejada. Essas chamadas alteram o modo como cada rótulo é gerenciado, sem destruí-lo. Para saber mais sobre o posicionamento de widgets, consulte gerenciadores de geometria do Tkinter.
Excluir widgets Tkinter permanentemente ao clicar em um botão
Chame destroy() no widget que deve ser removido. Neste exemplo, o botão Delete label chama label.destroy, que remove o rótulo, não o botão. Um widget destruído não pode ser restaurado com um gerenciador de geometria; crie um novo rótulo se precisar dele novamente. Execute este exemplo em Python 3 em uma sessão de computador com suporte ao Tk e clique em Delete label para remover o rótulo da janela.
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()