Как скрыть, восстановить и удалить Tkinter виджеты

Jinku Hu 30 Январь 2023 18 Апрель 2020
  1. Скрыть и восстановить виджеты Tkinter
  2. Удалить тикинтерные виджеты Нажмите кнопку
Как скрыть, восстановить и удалить Tkinter виджеты

В данном уроке мы продемонстрируем, как скрыть, восстановить и удалить Tkinter виджеты, нажав на кнопку. В конце мы также покажем, как удалить или убить существующие Tkinter-виджеты.

Скрыть и восстановить виджеты Tkinter

pack_forget() метод для сокрытия виджетов Tkinter Widgets

В отличие от метода pack в виджетах Tkinter, мы могли скрыть виджеты Tkinter, вызвав метод pack_forget() для того, чтобы сделать виджеты невидимыми.

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

Скрыть и восстановить виджеты можно, нажав кнопку

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

pack_forget() привязывается к команде кнопки buttonForget.

После нажатия кнопки виджет метки будет скрыт, но сама метка все еще существует, но становится невидимой.

Нам нужно снова вызвать метод pack() для упаковки виджета, чтобы сделать его видимым, или другими словами, для его восстановления.

grid_forget() Метод скрытия виджетов, если используется макет grid

Если виджеты размещаются в менеджере компоновки grid, то следует использовать метод grid_forget() для того, чтобы сделать виджеты 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()

Скрытие и восстановление виджетов методом grid_forget производится нажатием кнопки

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

Здесь мы связываем метод grid_forget с командой кнопки.

Вы можете заметить, что позиция метки не совпадает до того, как она будет скрыта после повторного вызова метода grid.

Если мы хотим восстановить исходную позицию метки, то метод grid_remove будет правильным вариантом.

grid_remove() Метод скрытия виджетов цинтера, если используется grid макет

grid_remove() скрывает виджет, но запоминает опции сетки, такие как колонка и ряд.

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

Скрывает и восстанавливает виджеты методом grid_remove, нажимая кнопку

Удалить тикинтерные виджеты Нажмите кнопку

В этом разделе мы покажем, как навсегда удалить виджеты Tkinter, вызвав метод destroy.

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 удаляет виджеты методом уничтожения нажатием кнопки

Кнопка удаляется после нажатия на нее.

Вы можете попробовать нажать кнопку buttonRecover, но получите уведомление об ошибке _tkinter.TclError, как показано ниже,

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

Сопутствующая статья - Tkinter Label