Удаление виджетов - 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()
1
2
3
4
5
6
7
8
9
10

Результат выполнения до нажатия кнопки:

del_widgets_01

Результат выполнения после нажатия кнопки:

del_widgets_02

Упражнения

  1. Напишите простую программу, состоящую из метки (label) и кнопки. При нажатии на кнопку метка должна скрываться.

Результат программы до и после нажатия на кнопку:

del_widgets_03

  1. Напишите программу с двумя кнопками отрисованные методом .pack():

    • при нажании первой кнопки она скрывает сама себя.
    • при нажатии второй кнопки она отрисовывает первую кнопку на прежнее место.

    button_del_show

Добавление/удаление виджетов - 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()
1
2
3
4
5
6
7
8
9
10
11

Результат программы до и после нажатия на кнопку:

del_widgets_04

Изменим добавление кнопок слева и добавим счетчик для наглядности удаления: кнопка удаляет саму себя:

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Результат программы после добавления и удаления некоторых кнопок:

del_widgets_05

Упражнения

  1. Напишите программу добавляющую кнопки справа, должно получиться следующего вида:

    del_widgets_06

  2. Напишите программу добавляющую кнопки в сетку - grid по диагонали. Для удаления виджетов используем методы: grid_forget() или grid_remove(). Должно получиться следующего вида:

    del_widgets_07

  3. Напишите программу добавляющую нопки в сетку - grid в первую колонку и увеличивающую длину заполняемых колонок. Добавление метки: Label(text=»Column {}».format(i)).grid(row=0, column=i) Для размещения и заполнения кнопки используется следующий код: …grid(row=i, column=0, columnspan=i+1, stick=NSEW) Должно получиться следующего вида:

    del_widgets_08

Добавление/удаление нескольких виджетов

Добавление группы виждетов одновременно с расчетом на дальнейшее возможное их удаление, можно создавать дополнительный фрейм, в него помещать все новые виджеты. При удалении группы виджетов, нужно просто удалить фрейм:

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Результат программы после добавления и удаления некоторых виджетов:

del_widgets_09

Упражнения

  1. Напишите программу добавляющую Label и кнопку для удаления:

    del_widgets_10

  2. Напишите программу добавляющую Radiobutton и кнопку для удаления:

    del_widgets_11

  3. Напишите программу добавляющую Checkbutton, Entry и кнопку для удаления:

    del_widgets_12

  4. Напишите программу генирующую список задач, с нумерацие и возможностью удаления.

    del_widgets_13

    Реализуя поведение нумерации, как в нумерованных списках текстовых редакторов. Внесите следующие изменения:

    • сгенерированые виджеты сохранять в массив для дальнейшей обработки.
    • при удалении поледних виджетов, виджеты сгенерированые заново начнут номерацию с последнего номера отрисованного виджета.
    • удаление виджета по середите ведет к удалению виджета из массива переименованию всех виджетов (перерисовки массива)