Удаление виджетов - 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()
2
3
4
5
6
7
8
9
10
Результат выполнения до нажатия кнопки:
Результат выполнения после нажатия кнопки:
Упражнения
- Напишите простую программу, состоящую из метки (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()
2
3
4
5
6
7
8
9
10
11
Результат программы до и после нажатия на кнопку:
Изменим добавление кнопок слева и добавим счетчик для наглядности удаления: кнопка удаляет саму себя:
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()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Результат программы после добавления и удаления некоторых кнопок:
Упражнения
Напишите программу добавляющую кнопки справа, должно получиться следующего вида:
Напишите программу добавляющую кнопки в сетку - 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()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Результат программы после добавления и удаления некоторых виджетов:
Упражнения
Напишите программу добавляющую Label и кнопку для удаления:
Напишите программу добавляющую Radiobutton и кнопку для удаления:
Напишите программу добавляющую Checkbutton, Entry и кнопку для удаления:
Напишите программу генирующую список задач, с нумерацие и возможностью удаления.
Реализуя поведение нумерации, как в нумерованных списках текстовых редакторов. Внесите следующие изменения:
- сгенерированые виджеты сохранять в массив для дальнейшей обработки.
- при удалении поледних виджетов, виджеты сгенерированые заново начнут номерацию с последнего номера отрисованного виджета.
- удаление виджета по середите ведет к удалению виджета из массива переименованию всех виджетов (перерисовки массива)