- Deleting widgets with Tkinter destroy()
- The Destroy Function
- # Удаление виджетов — delete widgets
- # Упражнения
- # Добавление/удаление виджетов — Add/delete widgets
- # Упражнения
- # Добавление/удаление нескольких виджетов
- # Упражнения
- Как скрыть, восстановить и удалить Tkinter виджеты
- Скрыть и восстановить виджеты Tkinter
- pack_forget() метод для сокрытия виджетов Tkinter Widgets
- grid_forget() Метод скрытия виджетов, если используется макет grid
- grid_remove() Метод скрытия виджетов цинтера, если используется grid макет
- Удалить тикинтерные виджеты Нажмите кнопку
- Сопутствующая статья — Tkinter Label
Deleting widgets with Tkinter destroy()
The Tkinter destroy method has the ability to “destroy” any Tkinter GUI objects. This includes widgets like Entry, Button, Toplevel and even the entire Tkinter application.
The syntax is very simple. You simply have to call it as a method on any Tkinter object as shown below.
root.destroy() # Destroys the whole Tkinter application mylabel.destroy() # Destroys a label toplevel.destroy() # Destroys a window
The Destroy Function
When used on root the destroy function will cause Tkinter to exit the mainloop() and simultaneously destroy all the widgets within the mainloop() .
from tkinter import * def close(): root.destroy() root = Tk() root.geometry('200x100') button = Button(root, text = 'Close the window', command = close) button.pack(pady = 10) root.mainloop()
The window produced by the above code. Clicking the button will destroy the window, causing it to disappear.
The code below is used simply to destroy a single individual widget.
from tkinter import * def delete(): mylabel.destroy() root = Tk() root.geometry('150x100') mylabel = Label(root, text = "This is some random text") mylabel.pack(pady = 5) mybutton = Button(root, text = "Delete", command = delete) mybutton.pack(pady = 5) root.mainloop()
Below is short 3 second video demonstrating the effect of the above code.
This marks the end of the Tkinter destroy widget article. Any suggestions or contributions for CodersLegacy are more than welcome. Questions regarding the article content can be asked in the comments section below.
# Удаление виджетов — delete widgets
Удаление виджетов из интерфейса осуществляется двумя способами:
pack_forget() , grid_forget() или grid_remove() — сделает виджет временно невидимым. Какой из них вы выберете, зависит от того, используете ли вы сетку или пакет, и хотите ли вы, чтобы сетка запомнила, где она была, чтобы вы могли позже поместить ее обратно в то же место.
destroy() — метод удаляет виджет.
Для примера используем код программы, в которой command=lambda: b.pack_forget() — создается лямбда функция, вызывающая у созданного объекта button метод pack_forget() :
from tkinter import * from tkinter.ttk import * root = Tk() label = Label(text="The button will be hidden. ") label.pack() button = Button(root, text="Hidden me", command=lambda: button.pack_forget()) button.pack() root.mainloop()
Результат выполнения до нажатия кнопки:
Результат выполнения после нажатия кнопки:
# Упражнения
- Напишите простую программу, состоящую из метки (label) и кнопки. При нажатии на кнопку метка должна скрываться.
Результат программы до и после нажатия на кнопку:
- Напишите программу с двумя кнопками отрисованные методом .pack() :
- при нажании первой кнопки она скрывает сама себя.
- при нажатии второй кнопки она отрисовывает первую кнопку на прежнее место.
# Добавление/удаление виджетов — Add/delete widgets
Для добавления и удаления виджетов создадим программу с функцией создания кнопок, которые будут удалять сами себя:
from tkinter import * from tkinter.ttk import * def add_button(): button = Button(text="I am here.)", command=lambda: button.pack_forget()) button.pack() root = Tk() button = Button(root, text="Add button", command=add_button) button.pack() root.mainloop()
Результат программы до и после нажатия на кнопку:
Изменим добавление кнопок слева и добавим счетчик для наглядности удаления: кнопка удаляет саму себя:
from tkinter import * from tkinter.ttk import * i = 1 def add_button(): global i button = Button(text="I am <>".format(i), command=lambda: button.pack_forget()) button.pack(side=LEFT) i += 1 root = Tk() button = Button(root, text="Add button", command=add_button) button.pack() root.mainloop()
Результат программы после добавления и удаления некоторых кнопок:
# Упражнения
- Напишите программу добавляющую кнопки справа, должно получиться следующего вида:
- Напишите программу добавляющую кнопки в сетку — grid по диагонали. Для удаления виджетов используем методы: grid_forget() или grid_remove() . Должно получиться следующего вида:
- Напишите программу добавляющую нопки в сетку — grid в первую колонку и увеличивающую длину заполняемых колонок. Добавление метки: Label(text=»Column <>».format(i)).grid(row=0, column=i) Для размещения и заполнения кнопки используется следующий код: …grid(row=i, column=0, columnspan=i+1, stick=NSEW) Должно получиться следующего вида:
# Добавление/удаление нескольких виджетов
Добавление группы виждетов одновременно с расчетом на дальнейшее возможное их удаление, можно создавать дополнительный фрейм, в него помещать все новые виджеты. При удалении группы виджетов, нужно просто удалить фрейм:
from tkinter import * from tkinter.ttk import * i = 1 def add_widgets(): global i lbl_frm = Labelframe(text="Frame <>".format(i)) lbl_frm.pack() Entry(lbl_frm, text="Text entry <>".format(i)).grid(row=0, column=0, stick=NSEW) button = Button(lbl_frm, text="Delete frame <>".format(i), command=lambda: lbl_frm.destroy()) button.grid(row=0, column=1) i += 1 root = Tk() Button(text="Add button", command=add_widgets).pack() root.mainloop()
Результат программы после добавления и удаления некоторых виджетов:
# Упражнения
- Напишите программу добавляющую Label и кнопку для удаления:
- Напишите программу добавляющую Radiobutton и кнопку для удаления:
- Напишите программу добавляющую Checkbutton, Entry и кнопку для удаления:
- Напишите программу генирующую список задач, с нумерацие и возможностью удаления. Реализуя поведение нумерации, как в нумерованных списках текстовых редакторов. Внесите следующие изменения:
- сгенерированые виджеты сохранять в массив для дальнейшей обработки.
- при удалении поледних виджетов, виджеты сгенерированые заново начнут номерацию с последнего номера отрисованного виджета.
- удаление виджета по середите ведет к удалению виджета из массива переименованию всех виджетов (перерисовки массива)
Как скрыть, восстановить и удалить Tkinter виджеты
- Скрыть и восстановить виджеты 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()
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()
Удалить тикинтерные виджеты Нажмите кнопку
В этом разделе мы покажем, как навсегда удалить виджеты 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()
Кнопка удаляется после нажатия на нее.
Вы можете попробовать нажать кнопку 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"
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.