Python tkinter как удалить объект
Для удаления применяется метод delete() , который в качестве параметра принимает идентификатор удаляемого элемента.
Здесь по нажатию на кнопку удаляется сама кнопка. В качестве аргумента в метод delete() передается идентификатор, который мы получаем при добавлении кнопки.
Управление координатами
Для получения/изменения координат элеимента применяется метод coords() :
Первая версия возвращает координаты в виде списка значений для элемента с определенным идентификатором.
Вторая и третья версии изменяют позицию, получая в качестве второго/третьего параметра(ов) новые координаты.
Например, динамически изменим координаты:
Здесь по нажатию на кнопку к координате y добавляется +-10. Когда кнопка достигает границ Canvas, то изменяем знак приращения на противоположный, и таким образом, кнопка изменяет направление движения.
Изменение параметров элемента
Для изменения параметров элемента на Canvas применяется метод itemconfigure() . В качестве обязательного параметра он принимает идентифкатор изменяемого элемента, а второй параметр — набор устанавливаемых параметров:
Например, изменим цвет линии:
В данном случае в окне определены два переключателя Radiobutton. Они привязаны к переменной selected_color, которая хранит выбранный цвет — «red» или «blue».
На canvas нарисована линия. При нажатии на один из переключателей изменяем цвет линии:
# Удаление виджетов — delete widgets
Удаление виджетов из интерфейса осуществляется двумя способами:
- скрытие выджета — делая его невидимым
- удаление виджета
pack_forget() , grid_forget() или grid_remove() — сделает виджет временно невидимым. Какой из них вы выберете, зависит от того, используете ли вы сетку или пакет, и хотите ли вы, чтобы сетка запомнила, где она была, чтобы вы могли позже поместить ее обратно в то же место.
destroy() — метод удаляет виджет.
Для примера используем код программы, в которой command=lambda: b.pack_forget() — создается лямбда функция, вызывающая у созданного объекта button метод pack_forget() :
Результат выполнения до нажатия кнопки:
Результат выполнения после нажатия кнопки:
# Упражнения
- Напишите простую программу, состоящую из метки (label) и кнопки. При нажатии на кнопку метка должна скрываться.
Результат программы до и после нажатия на кнопку:
Напишите программу с двумя кнопками отрисованные методом .pack() :
- при нажании первой кнопки она скрывает сама себя.
- при нажатии второй кнопки она отрисовывает первую кнопку на прежнее место.
# Добавление/удаление виджетов — Add/delete widgets
Для добавления и удаления виджетов создадим программу с функцией создания кнопок, которые будут удалять сами себя:
Результат программы до и после нажатия на кнопку:
Изменим добавление кнопок слева и добавим счетчик для наглядности удаления: кнопка удаляет саму себя:
Результат программы после добавления и удаления некоторых кнопок:
# Упражнения
Напишите программу добавляющую кнопки справа, должно получиться следующего вида:
Напишите программу добавляющую кнопки в сетку — 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) Должно получиться следующего вида:
# Добавление/удаление нескольких виджетов
Добавление группы виждетов одновременно с расчетом на дальнейшее возможное их удаление, можно создавать дополнительный фрейм, в него помещать все новые виджеты. При удалении группы виджетов, нужно просто удалить фрейм:
Результат программы после добавления и удаления некоторых виджетов:
# Упражнения
Напишите программу добавляющую Label и кнопку для удаления:
Напишите программу добавляющую Radiobutton и кнопку для удаления:
Напишите программу добавляющую Checkbutton, Entry и кнопку для удаления:
Напишите программу генирующую список задач, с нумерацие и возможностью удаления.

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

В данном уроке мы продемонстрируем, как скрыть, восстановить и удалить Tkinter виджеты, нажав на кнопку. В конце мы также покажем, как удалить или убить существующие Tkinter-виджеты.
Please enable JavaScript
Скрыть и восстановить виджеты Tkinter
pack_forget() метод для сокрытия виджетов Tkinter Widgets
В отличие от метода pack в виджетах Tkinter, мы могли скрыть виджеты Tkinter, вызвав метод pack_forget() для того, чтобы сделать виджеты невидимыми.
pack_forget() привязывается к команде кнопки buttonForget .
После нажатия кнопки виджет метки будет скрыт, но сама метка все еще существует, но становится невидимой.
Нам нужно снова вызвать метод pack() для упаковки виджета, чтобы сделать его видимым, или другими словами, для его восстановления.
grid_forget() Метод скрытия виджетов, если используется макет grid
Если виджеты размещаются в менеджере компоновки grid , то следует использовать метод grid_forget() для того, чтобы сделать виджеты Tkinter невидимыми.
Здесь мы связываем метод grid_forget с командой кнопки.
Вы можете заметить, что позиция метки не совпадает до того, как она будет скрыта после повторного вызова метода grid .
Если мы хотим восстановить исходную позицию метки, то метод grid_remove будет правильным вариантом.
grid_remove() Метод скрытия виджетов цинтера, если используется grid макет
grid_remove() скрывает виджет, но запоминает опции сетки, такие как колонка и ряд .
Удалить тикинтерные виджеты Нажмите кнопку
В этом разделе мы покажем, как навсегда удалить виджеты Tkinter, вызвав метод destroy .
Tkinter. Canvas, рисование графики (часть 3)
В прошлый раз мы научились создавать фигуры на полотне программы и перемещать их. Сегодня мы продолжим рассматривать объект класса Canvas . В частности, разберем, как обнаруживать пересечение нескольких объектов, удалять элементы, которые были добавлены ранее, как связывать события с элементами полотна, принципы drag and drop ( и что это такое). Также разберем ряд других особенностей.
Определение пересечений между объектами
Кроме перемещения объектов пользователь также может определять, пересекается ли один с другим. Как этого добиться? Этот результат достигается за счет того, что все объекты находятся в прямоугольных контейнерах. А чтобы определять пересечения, используется метод find_overlapping() , который находится в классе Canvas .
Эта программа создает несколько прямоугольников. Пользователь может управлять синим прямоугольником, перемещая его так, как душе угодно.
Если обнаруживается пересечение с каким-то маленьким квадратиком, он становится желтым.
В целом, код очень напоминает тот, который был реализован в предыдущей части. Поэтому рассмотрим лишь те части, которые отвечают за создание новых прямоугольников и обращение к методу canvas.find_overlapping() .
Определение исключений
До того, как элементы начали пересекаться между собой, все квадраты на полотне имеют зеленый цвет. Чтобы получить идентификаторы данных объектов, необходимо воспользоваться методом canvas.find_all() .
Когда мы сбросили цвета элементов, воспользуемся методом find_overlapping() , который вызывается из объекта класса Canvas . Таким образом, мы получим все пересечения элементов. При этом тот объект, который перемещается, исключается из цикла, в то время как цвет остальных элементов становится желтым, как приводится на рисунке выше.
Эта функция продолжит выполняться, перемещая синий прямоугольник на определенное расстояние. Он же себя снова планирует, используя process_movements () после этого.
Если требуется понять, когда движущийся объект перекрывает другой полностью (а не лишь частично), то используется другой метод. Параметры те же самые, только отличается название. Для этой цели используется функция canvas.find_enclosed() .
Как удалять элементы?
Кроме добавления и редактирования объектов, их также можно удалять с помощью метода delete() . В целом, никаких особенностей, отличающих его от других, нет. Тем не менее, есть определенные шаблоны.
Необходимо понимать, что рендеринг зависит от количества объектов на полотне. Поэтому удаление неиспользуемых напрямую влияет на производительность.
Давайте попробуем создать программу, которая выбирает несколько кругов на полотне и удаляет их. Особых правил не будет, она их будет удалять полностью случайным образом.

Запускать удаление элементов будет специальная кнопка на экране. В свою очередь, другая будет отвечать за их создание.
Чтобы размещение объектов на полотне было случайным, необходимо воспользоваться модулем random , а именно, – функцией randint . А выбор цвета будет осуществляться, исходя из определенного набора, а также будет использоваться вызов choice для этой операции.
После генерации удаление элементов возможно с использованием обработчика on_click или кнопки Clearitems , которая задействует функцию обратного вызова clear_all . Этот метод вызывает canvas.delete() .
Принцип удаления элементов
Методу canvas.delete() передается аргумент, который может служить идентификатором элемента или тегом. С его помощью осуществляется один или несколько объектов. Их количество зависит от того, сколько раз этот тег будет использоваться.
Чтобы посмотреть, как работает удаление элемента по идентификатору, необходимо посмотреть на содержимое обработчика on_click .
Важно! Если кликнуть по пустой точке, то методом canvas.find_withtag(tk.CURRENT) будет возвращено значение None. Тем не менее, его передача методу delete() не будет считаться ошибкой, поскольку этот параметр не совпадает ни с одним тегом или идентификатором .
Простыми словами, этот параметр может использоваться. Правда, никакого действия в этом случае не будет.
В функции обратного вызова clear_items() также находится другой пример удаления элементов. Здесь используется тег ALL , соответствующий всем элементам и удаляющих их из полотна.
При этом нет необходимости добавлять тег ALL каждый раз. Он работает по умолчанию.
Как связывать события с элементами полотна?
Вам уже известно, каким образом настраивается связь событий с виджетами. С элементами, содержащимися в полотне, также можно это делать. Это значительно удобнее, чем каждый раз определять необходимые действия через объект Canvas .
Эта программа демонстрирует, как работает drag and drop для элементов полотна. То есть, перетягивание.
Рендеринг полотна в файл PostScript
Можно также сохранить содержимое полотна в файл формата PostScript. Давайте немного модифицируем код, чтобы в нем появилась возможность выводить содержимое в этот файл.