Come nascondere, recuperare e cancellare i widget di Tkinter

Jinku Hu 25 giugno 2020
  1. Nascondere e recuperare i widget di Tkinter
  2. Cancellare i widget di Tkinter in modo permanente cliccando su un pulsante
Come nascondere, recuperare e cancellare i widget di Tkinter

In questo tutorial, mostreremo come nascondere, recuperare i widget di Tkinter, facendo clic su un pulsante. Infine, vi mostreremo anche come eliminare o eliminare i widget Tkinter esistenti.

Nascondere e recuperare i widget di Tkinter

Metodo pack_forget() per nascondere i widget di Tkinter

Al contrario di metodo pack nei widget di Tkinter, potremmo nascondere i widget di Tkinter chiamando il metodo pack_forget() per rendere i widget invisibili.

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 nasconde e recupera i widget facendo clic su un pulsante

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

pack_forget() è legato al comando del pulsante buttonForget.

Nasconderà il widget dell’etichetta dopo aver cliccato il pulsante, ma l’etichetta stessa esiste ancora, ma diventa invisibile.

Dobbiamo richiamare il metodo pack() per impacchettare di nuovo il widget per renderlo visibile, o in altre parole, per recuperarlo.

grid_forget() Metodo per nascondere i widget di Tkinter se si usa il layout grid

Se i widget sono posizionati con il gestore di layout grid, dovremmo usare il metodo grid_forget() per rendere i widget di Tkinter invisibili.

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 nasconde e recupera i widget con il metodo grid_forget facendo clic su un pulsante

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

Qui, leghiamo il metodo grid_forget al comando del pulsante.

Si potrebbe notare che la posizione dell’etichetta non è la stessa prima che venga nascosta dopo aver richiamato il metodo grid.

Se intendiamo ripristinare l’etichetta nella sua posizione originale, il metodo grid_remove sarà l’opzione giusta.

grid_remove() Metodo per nascondere i widget di Tkinter se si usa il layout grid

grid_remove() nasconde il widget ma ricorda le opzioni della griglia come column e 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 nasconde e recupera i widget con il metodo grid_remove facendo clic su un pulsante

Cancellare i widget di Tkinter in modo permanente cliccando su un pulsante

Vi mostreremo come cancellare i widget di Tkinter in modo permanente chiamando il metodo destroy in questa sezione.

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 elimina i widget con il metodo distruggi cliccando su un pulsante

Il tasto viene cancellato dopo aver cliccato il tasto.

Si può provare a fare clic sul pulsante buttonRecover ma si otterrà la notifica di errore _tkinter.TclError come segue,

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"
Autore: 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

Articolo correlato - Tkinter Label