Como esconder, recuperar e excluir widgets Tkinter

Jinku Hu 30 janeiro 2023
  1. Esconder e Recuperar Widgets de Tkinter
  2. Apagar Widgets de Tkinter Permanentemente Clicando em um Botão
Como esconder, recuperar e excluir widgets Tkinter

Neste tutorial, vamos demonstrar como esconder, recuperar os widgets Tkinter, clicando em um botão. Eventualmente, também lhe mostraremos como apagar ou matar widgets Tkinter existentes.

Esconder e Recuperar Widgets de Tkinter

pack_forget() método para esconder Tkinter Widgets

Em contraste com método pack nos widgets Tkinter, poderíamos esconder os widgets Tkinter chamando pack_forget() método para tornar os widgets invisíveis.

try:
    import Tkinter as tk
except:
    import tkinter as tk


class Test:
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(self.root, text="Label")
        self.buttonForget = tk.Button(
            self.root,
            text="Click to hide Label",
            command=lambda: self.label.pack_forget(),
        )
        self.buttonRecover = tk.Button(
            self.root, text="Click to show Label", command=lambda: self.label.pack()
        )

        self.buttonForget.pack()
        self.buttonRecover.pack()
        self.label.pack(side="bottom")
        self.root.mainloop()

    def quit(self):
        self.root.destroy()


app = Test()

Esconder e recuperar os widgets de Tkinter clicando em um botão

self.buttonForget = tk.Button(
    self.root, text="Click to hide Label", command=lambda: self.label.pack_forget()
)

O pack_forget() está ligado ao comando do botão buttonForget.

Ele irá esconder o widget da etiqueta após clicar no botão, mas a própria etiqueta ainda existe, mas torna-se invisível.

Nós precisamos chamar o método pack() novamente para empacotar o widget para torná-lo visível, ou em outras palavras, para recuperá-lo.

grid_forget() Method to Hide Tkinter Widgets if grid Layout é Usado

Se os widgets são colocados com o gerenciador de layout grid, devemos utilizar o método grid_forget() para tornar os widgets Tkinter invisíveis.

try:
    import Tkinter as tk
except:
    import tkinter as tk


class Test:
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(self.root, text="Label")
        self.buttonForget = tk.Button(
            self.root,
            text="Click to hide Label",
            command=lambda: self.label.grid_forget(),
        )
        self.buttonRecover = tk.Button(
            self.root, text="Click to show Label", command=lambda: self.label.grid()
        )

        self.buttonForget.grid(column=0, row=0, padx=10, pady=10)
        self.buttonRecover.grid(column=0, row=1, padx=10, pady=10)
        self.label.grid(column=0, row=2, padx=10, pady=10)
        self.root.mainloop()

    def quit(self):
        self.root.destroy()


app = Test()

O Tkinter esconde e recupera widgets com o método grid_forget, clicando em um botão

self.buttonForget = tk.Button(
    self.root, text="Click to hide Label", command=lambda: self.label.grid_forget()
)

Aqui, nós ligamos o método grid_forget ao comando do botão.

Você pode notar que a posição da etiqueta não é a mesma antes de ser escondida depois que você chamar o método grid novamente.

Se pretendemos restaurar a etiqueta à sua posição original, o método grid_remove deve ser a opção certa.

grid_remove() Method to Hide Tkinter Widgets if grid Layout é usado

grid_remove() esconde o widget mas lembra-se das opções de grade como column e linha.

try:
    import Tkinter as tk
except:
    import tkinter as tk


class Test:
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(self.root, text="Label")
        self.buttonForget = tk.Button(
            self.root,
            text="Click to hide Label",
            command=lambda: self.label.grid_remove(),
        )
        self.buttonRecover = tk.Button(
            self.root, text="Click to show Label", command=lambda: self.label.grid()
        )

        self.buttonForget.grid(column=0, row=0, padx=10, pady=10)
        self.buttonRecover.grid(column=0, row=1, padx=10, pady=10)
        self.label.grid(column=0, row=2, padx=10, pady=20)
        self.root.mainloop()

    def quit(self):
        self.root.destroy()


app = Test()

Tkinter esconde e recupera widgets com o método grid_remove, clicando em um botão

Apagar Widgets de Tkinter Permanentemente Clicando em um Botão

Mostraremos como excluir permanentemente os widgets Tkinter chamando o método destroy nesta seção.

try:
    import Tkinter as tk
except:
    import tkinter as tk


class Test:
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(self.root, text="Label")
        self.buttonForget = tk.Button(
            self.root, text="Click to hide Label", command=lambda: self.label.destroy()
        )
        self.buttonRecover = tk.Button(
            self.root, text="Click to show Label", command=lambda: self.label.pack()
        )

        self.buttonForget.pack()
        self.buttonRecover.pack()
        self.label.pack(side="bottom")
        self.root.mainloop()

    def quit(self):
        self.root.destroy()


app = Test()

Tkinter excluir widgets com o método destroy, clicando em um botão

O botão é apagado após clicar no botão.

Você pode tentar clicar no botão buttonRecover mas receberá a notificação de erro _tkinter.TclError como abaixo,

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\WinPython\WPy-3661\python-3.6.6.amd64\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:\Users\jinku\OneDrive\Bureaublad\test.py", line 17, in <lambda>
    command=lambda: self.label.pack())
  File "D:\WinPython\WPy-3661\python-3.6.6.amd64\lib\tkinter\__init__.py", line 2140, in pack_configure
    + self._options(cnf, kw))
_tkinter.TclError: bad window path name ".!label"
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artigo relacionado - Tkinter Label