Cómo ocultar, recuperar y eliminar los widgets de Tkinter

Jinku Hu 30 enero 2023
  1. Ocultar y recuperar los widgets de Tkinter
  2. Elimine los Widgets de Tkinter de forma permanente haciendo clic en un botón
Cómo ocultar, recuperar y eliminar los widgets de Tkinter

En este tutorial, demostraremos cómo ocultar, recuperar los widgets de Tkinter, haciendo clic en un botón. Finalmente, también te mostraremos cómo eliminar o matar los widgets de Tkinter existentes.

Ocultar y recuperar los widgets de Tkinter

Método pack_forget() para ocultar los Widgets de Tkinter

A diferencia del método pack method en los widgets de Tkinter, podríamos ocultar los widgets de Tkinter llamando al método pack_forget() para hacerlos invisibles.

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

Tkinter esconde y recupera los widgets haciendo clic en un botón

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

pack_forget() está ligado al comando del botón buttonForget.

Ocultará el widget de la etiqueta después de hacer clic en el botón, pero la etiqueta en sí sigue existiendo pero se vuelve invisible.

Necesitamos llamar al método pack() de nuevo para empaquetar el widget para hacerlo visible, o en otras palabras, para recuperarlo.

grid_forget() Método para ocultar los widgets de Tkinter si se usa el diseño grid

Si los widgets se colocan con el gestor de diseño grid, deberíamos usar el método grid_forget() para hacer invisibles los widgets de Tkinter.

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

Tkinter oculta y recupera los widgets con el método grid_forget pulsando un botón

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

Aquí, enlazamos el método grid_forget al comando del botón.

Podrías notar que la posición de la etiqueta no es la misma antes de que se oculte después de que vuelvas a llamar al método grid.

Si pretendemos restaurar la etiqueta a su posición original, el método grid_remove será la opción correcta.

grid_remove() Método para ocultar los widgets de Tkinter si se utiliza el diseño grid

grid_remove() oculta el widget pero recadena las opciones de la parrilla como column y row.

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 y recupera los widgets con el método grid_remove haciendo click en un botón

Elimine los Widgets de Tkinter de forma permanente haciendo clic en un botón

Mostraremos cómo eliminar los widgets de Tkinter de forma permanente llamando al método destroy en esta sección.

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 borra los widgets con el método destroy pulsando un botón

El botón se borra después de hacer clic en el botón.

Puede intentar hacer clic en el botón buttonRecover pero obtendrá la notificación de error _tkinter.TclError como se muestra a continuación,

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

Artículo relacionado - Tkinter Label