Python tkinter как удалить объект
Перейти к содержимому

Python tkinter как удалить объект

  • автор:

Python tkinter как удалить объект

Для удаления применяется метод delete() , который в качестве параметра принимает идентификатор удаляемого элемента.

Здесь по нажатию на кнопку удаляется сама кнопка. В качестве аргумента в метод delete() передается идентификатор, который мы получаем при добавлении кнопки.

Управление координатами

Для получения/изменения координат элеимента применяется метод coords() :

Первая версия возвращает координаты в виде списка значений для элемента с определенным идентификатором.

Вторая и третья версии изменяют позицию, получая в качестве второго/третьего параметра(ов) новые координаты.

Например, динамически изменим координаты:

Здесь по нажатию на кнопку к координате y добавляется +-10. Когда кнопка достигает границ Canvas, то изменяем знак приращения на противоположный, и таким образом, кнопка изменяет направление движения.

Изменение параметров элемента

Для изменения параметров элемента на Canvas применяется метод itemconfigure() . В качестве обязательного параметра он принимает идентифкатор изменяемого элемента, а второй параметр — набор устанавливаемых параметров:

Например, изменим цвет линии:

В данном случае в окне определены два переключателя Radiobutton. Они привязаны к переменной selected_color, которая хранит выбранный цвет — «red» или «blue».

На canvas нарисована линия. При нажатии на один из переключателей изменяем цвет линии:

How to clear out a frame in the Tkinter?

Tkinter frames are used to group and organize too many widgets in an aesthetic way. A frame component can contain Button widgets, Entry Widgets, Labels, ScrollBars, and other widgets.

If we want to clear the frame content or delete all the widgets inside the frame, we can use the destroy() method. This method can be invoked by targeting the children of the frame using winfo_children().

Example

Output

Running the above code will display a window containing a button “Clear” that targets all the widgets inside the frame and clears it.

Now click on the “Clear” Button and it will clear all the widgets inside the frame.

How to delete Tkinter widgets from a window?

I have a list of tkinter widgets that I want to change dynamically.

How to delete the widgets from the window?

9 Answers 9

You can call pack_forget to remove a widget (if you use pack to add it to the window).

If you use pack_forget , you can later show the widget again calling pack again. If you want to permanently delete it, call destroy on the widget (then you won’t be able to re-add it).

If you use the grid method, you can use grid_forget or grid_remove to hide the widget.

sloth's user avatar

One way you can do it, is to get the slaves list from the frame that needs to be cleared and destroy or «hide» them according to your needs. To get a clear frame you can do it like this:

You should call grid_slaves() , pack_slaves() or slaves() depending on the method you used to add the widget to the frame.

You simply use the destroy() method to delete the specified widgets like this:

Using this you can completely destroy the specific widgets.

Feezan Khattak's user avatar

You say that you have a list of widgets to change dynamically. Do you want to reuse and reconfigure existing widgets, or create all new widgets and delete the old ones? It affects the answer.

If you want to reuse the existing widgets, just reconfigure them. Or, if you just want to hide some of them temporarily, use the corresponding «forget» method to hide them. If you mapped them with pack() calls, you would hide with pack_forget() (or just forget() ) calls. Accordingly, grid_forget() to hide gridded widgets, and place_forget() for placed widgets.

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

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

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

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

Please enable JavaScript

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 .

# Удаление виджетов — delete widgets

Удаление виджетов из интерфейса осуществляется двумя способами:

  • скрытие выджета — делая его невидимым
  • удаление виджета

pack_forget() , grid_forget() или grid_remove() — сделает виджет временно невидимым. Какой из них вы выберете, зависит от того, используете ли вы сетку или пакет, и хотите ли вы, чтобы сетка запомнила, где она была, чтобы вы могли позже поместить ее обратно в то же место.

destroy() — метод удаляет виджет.

Для примера используем код программы, в которой command=lambda: b.pack_forget() — создается лямбда функция, вызывающая у созданного объекта button метод pack_forget() :

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

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

# Упражнения

  1. Напишите простую программу, состоящую из метки (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 и кнопку для удаления:

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

del_widgets_13

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

How to clear out a frame in the Tkinter?

Tkinter frames are used to group and organize too many widgets in an aesthetic way. A frame component can contain Button widgets, Entry Widgets, Labels, ScrollBars, and other widgets.

If we want to clear the frame content or delete all the widgets inside the frame, we can use the destroy() method. This method can be invoked by targeting the children of the frame using winfo_children().

Example

Output

Running the above code will display a window containing a button “Clear” that targets all the widgets inside the frame and clears it.

Now click on the “Clear” Button and it will clear all the widgets inside the frame.

Canvas, рисование графики ч.3 / tkinter 20

В продолжение предыдущего материала о поиске ближайшего элемента стоит отметить, что существует также возможность определять, пересекается ли один прямоугольник с другим. Этого можно добиться благодаря тому, что все элементы заключены в прямоугольные контейнеры. А для определения пересечений используется метод find_overlapping() из класса Canvas .

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

Определение пересечений между элементами

Поскольку код во многом повторяет предыдущий, отметим лишь те части кода, которые отвечают за создание новых прямоугольников и вызов метода canvas.find_overlapping() :

Как определяются пересечения

До пересечения цвет заполнения всех прямоугольников на полотне, кроме управляемого пользователем, будет зеленым. Идентификаторы этих элементов можно получить с помощью метода canvas.find_all() :

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

Метод продолжает выполнение, перемещая синий прямоугольник на заданный показатель сдвига, и планируя себя же снова с помощью process_movements() .

Если нужно определить, когда движущийся элемент полностью перекрывает другой (а не частично), то стоит воспользоваться методом canvas.find_enclosed() вместо canvas.find_overlapping() с теми же параметрами.

Удаление элементов с полотна

Помимо добавления и изменения элементов полотна их также можно удалять с помощью метода delete() класса Canvas . Хотя в принципах его работы нет каких-либо особенностей, существуют кое-какие паттерны, которые будут рассмотрены дальше.

Стоит учитывать, что чем больше элементов на полотне, тем дольше Tkinter будет рендерить виджет. Таким образом важно удалять неиспользуемые для улучшения производительности.

В этом примере создадим приложение, которое случайным образом выбирает несколько кругов на полотне. Каждый кружок будет удаляться по клику. Одна кнопка в нижней части виджета сбрасывает состояние полотна, а вторая — удаляет все элементы.

Canvas, рисование графики ч.3 / tkinter 20

Чтобы случайным образом размещать элементы на полотне, будем генерировать координаты с помощью функции randint модуля random . Цвет элемента будет выбираться случайным образом с помощью вызова choice и определенного набора цветов.

После генерации элементы можно будет удалить с помощью обработчика on_click или кнопки Clearitems , которая, в свою очередь, вызывает функцию обратного вызова clear_all . Внутри этот метод вызывает canvas.delete() с нужными параметрами:

Как работает удаление элементов

Метод canvas.delete() принимает один аргумент, который может быть идентификатором элемента или тегом, и удаляет один или несколько соответствующих элементов (поскольку тег может быть использован несколько раз).

В обработчике on_click() можно увидеть пример удаления элемента по идентификатору:

Стоит также отметить, что если сейчас кликнуть по пустой точке, то canvas.find_withtag(tk.CURRENT) вернет None , но когда это значение будет передано в canvas.delete() , то ошибки не будет. Это объясняется тем, что параметр None не совпадает ни с одним идентификатором или тегом. Таким образом это валидный параметр, хоть в результате никакое действие и не выполняется.

В функции обратного вызова clear_items() можно найти другой пример удаления элементов. Здесь вместо передачи идентификатора элемента используется тег ALL , который соответствует всем элементам и удаляет их с полотна:

Можно обратить внимание на то, что тег ALL работает «из коробки», поэтому его не нужно добавлять каждому элементу полотна.

Связывание событий с элементами полотна

Вы уже знаете, как связывать события с виджетами, но то же самое можно делать и с элементами. Это помогает писать более специфичные и простые обработчики событий. Такой намного удобнее, чем связывать все события с экземпляром Canvas и потом определять, какое из них нужно в текущий момент.

Следующее приложение показывает, как реализовать функциональность drag and drop для элементов полотна. Это распространенная особенность, которая способна значительно упростить программы.

Создадим несколько элементов (прямоугольник и овал), которые можно будет перетаскивать с помощью мыши. Разная форма поможет заметить, как события кликов корректно применяются к элементам, даже когда они пересекаются между собой:

Как работает drag and drop

Для связывания событий с элементами используется метод tag_bind() из класса Canvas . Это добавляет связывание для всех элементов, которые соответствуют конкретному элементу — тегу draggable в этом случае.

И хотя метод называется tag_bind() вместо тега в него можно передавать также идентификатор:

Также стоит отметить, что новое поведение затронет только уже существующие элементы, поэтому если позже добавить новые с тегом draggable , то к ним связывание применено не будет.

Метод button_press() — это обработчик, который запускается после нажатия на элемент. Традиционный паттерн для получения соответствующего элемента — вызов canvas.find_withtag(tk.CURRENT) .

Идентификатор элемента, а также координаты x и y события click хранятся в поле dnd_item . Эти значения позже будут использованы для перемещения элемента в соответствии с движением мыши:

Метод button_motion() обрабатывает события движения мыши до тех пор, пока зажата основная кнопка.

Для определения дистанции, на которую должен быть перемещен элемент, нужно вычислить разницу текущей позиции с предыдущими координатами. Эти значения передаются в метод canvas.move() и снова сохраняются в поле dnd_item :

Существуют вариации этой drag & drop функциональности, которые также задействуют обработчик последовательности . Она сбрасывает текущий элемент.

Однако использовать его необязательно, потому что после того как это событие происходит, связывание не запустится до очередного клика по элементу. Это также помогает избежать проверки того, не является ли None значением dnd_item в начале обработчика button_motion() .

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

Для этого используются паттерны, которые рассматривались в прошлых примерах. С их помощью можно вычислять ширину и высоту полотна и убедиться, что финальное положение элемента находится в пределах валидного диапазона с помощью цепочки операторов сравнения. В качестве шаблона для этого можно использовать следующий код:

Рендер полотна в файл PostScript

Класс Canvas нативно поддерживает сохранение содержимого с помощью языка PostScript и метода postscript() . Он сохраняет графическое представление элементов полотна (линий, прямоугольников, овалов и так далее), но не его виджетов или изображений.

Изменим прошлый пример, который динамически генерирует этот тип простых элементов, и добавим функциональность для сохранения полотна в файл PostScript.

Возьмем уже знакомый код и добавим в него кусок для вывода содержимого полотна в файл PostScript:

Как работает рендеринг в .ps

Основное нововведение — это кнопка Render canvas с функцией обратного вызова render_canvas() .

Она вызывает метод postscript() для экземпляра canvas с аргументами file и colormode . Эти параметры определяют путь к расположению файла, а также информацию о цвете. Вторым параметром может быть color для полностью цветного вывода, gray — для использования оттенков серого или mono — для конвертации цветов в черный и белый:

Все параметры, которые можно передать в postscript() , стоит искать в официальной документации Tk/Tcl по ссылке https://www.tcl.tk/m an/tcl8.6/TkCmd/canvas.htm#M61. Стоит напомнить, что PostScript — язык печати, поэтому большая часть его параметров касается настроек страницы.

Поскольку файлы PostScript не так популярны, как другие форматы файлов, возможно, возникнет необходимость конвертировать готовый файл во что-то более знакомое — например, PDF.

Для этого нужен сторонний софт, такой как, например, Ghostscript, который распространяется по лицензии GNU APGL. Интерпретатор и инструмент рендеринга можно вызвать из программы для автоматической конвертации результатов PostScript в PDF.

Python tkinter как удалить объект

Для удаления применяется метод delete() , который в качестве параметра принимает идентификатор удаляемого элемента.

Здесь по нажатию на кнопку удаляется сама кнопка. В качестве аргумента в метод delete() передается идентификатор, который мы получаем при добавлении кнопки.

Управление координатами

Для получения/изменения координат элеимента применяется метод coords() :

Первая версия возвращает координаты в виде списка значений для элемента с определенным идентификатором.

Вторая и третья версии изменяют позицию, получая в качестве второго/третьего параметра(ов) новые координаты.

Например, динамически изменим координаты:

Здесь по нажатию на кнопку к координате y добавляется +-10. Когда кнопка достигает границ Canvas, то изменяем знак приращения на противоположный, и таким образом, кнопка изменяет направление движения.

Изменение параметров элемента

Для изменения параметров элемента на Canvas применяется метод itemconfigure() . В качестве обязательного параметра он принимает идентифкатор изменяемого элемента, а второй параметр — набор устанавливаемых параметров:

Например, изменим цвет линии:

В данном случае в окне определены два переключателя Radiobutton. Они привязаны к переменной selected_color, которая хранит выбранный цвет — «red» или «blue».

На canvas нарисована линия. При нажатии на один из переключателей изменяем цвет линии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *