Как очистить канвас в tkinter

Как очистить холст Tkinter?

Когда я рисую форму, используя:

Отслеживает ли Tkinter тот факт, что он был создан?

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

Я создаю тысячи прямоугольных объектов в памяти?

Я знаю, что вы можете присвоить приведенный выше код переменной, но если я не сделаю этого и просто начертлю непосредственно на холсте, он останется в памяти или просто прорисует пиксели, как на холсте HTML5?

3 ответа

Чтобы очистить холст, используйте метод delete. Задайте ему специальный параметр «all» для удаления всех элементов на холсте (строка «all» «является специальным тегом, который представляет все элементы на холсте):

Если вы хотите удалить только определенные элементы на холсте (например, объекты переднего плана, оставив фоновые объекты на дисплее), вы можете назначить теги каждому элементу. Затем вместо «all» вы можете указать имя тега.

Если вы создаете игру, вам, вероятно, не нужно удалять и воссоздавать предметы. Например, если у вас есть объект, который перемещается по экрану, вы можете использовать move или координат для перемещения элемента.

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

Элементы, нарисованные на холсте, являются постоянными. create_rectangle возвращает идентификатор элемента, который вы должны отслеживать. Если вы не удалите старые элементы, ваша программа в конечном итоге замедлится.

Источник

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

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

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

Как очистить канвас в tkinter

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

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

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

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

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

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

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

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

Как очистить канвас в tkinter

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Как очистить холст Tkinter?

когда я рисую фигуру с помощью:

отслеживает ли Tkinter тот факт, что он был создан?

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

Я создаю тысячи объектов прямоугольника в памяти?

Я знаю, что вы можете назначить код выше переменной, но если я не делайте этого и просто рисуйте прямо на холсте, он остается в памяти или просто рисует пиксели, как на холсте HTML5?

3 ответов

каждый элемент холста-это объект, который отслеживает Tkinter. Если вы очищаете экран, просто рисуя черный прямоугольник, то вы фактически создали утечку памяти, в конце концов, ваша программа рухнет из-за миллионов элементов, которые были разработаны.

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

предметы, нарисованные на холсте являются постоянными. create_rectangle возвращает идентификатор элемента, который нужно отслеживать. Если вы не удалите старые элементы, ваша программа в конечном итоге замедлится.

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

Источник

Как очистить холст Tkinter?

Когда я рисую форму, используя:

Поддерживает ли Tkinter то, что он был создан?

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

Я создаю тысячи объектов прямоугольника в памяти?

Я знаю, что вы можете назначить код выше переменной, но если я этого не сделаю и просто рисую непосредственно на холсте, он останется в памяти или просто нарисует пиксели, как в холсте HTML5

3 ответа

Чтобы очистить холст, используйте метод delete. Дайте ему специальный параметр «all» для удаления всех элементов на холсте (строка «all» «- это специальный тег, который представляет все элементы на холсте):

Если вы хотите удалить только определенные элементы на холсте (например, объекты переднего плана, оставив на экране фоновые объекты), вы можете назначить теги каждому элементу. Затем вместо «all» вы можете указать имя тега.

Если вы создаете игру, вам, вероятно, не нужно удалять и воссоздавать элементы. Например, если у вас есть объект, который перемещается по экрану, вы можете использовать move или coords для перемещения элемента.

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

Источник

Как очистить Tkinter холст?

Когда я нарисуйте фигуру, используя:

Не Tkinter следить за тем, что он был создан?

В простой игре я’м делаю, мой код имеет один «каркас» создать кучу прямоугольников, а затем нарисуйте большой черный прямоугольник, чтобы очистить экран, а затем нарисуйте еще один набор обновленных прямоугольники, и так далее.

Я создаю тысячи объектов прямоугольник в памяти?

Я знаю, что вы можете назначить код так, чтобы переменная, но если я не’т делать, что и просто рисовать прямо на холсте, оно остается в памяти, или это просто рисовать пиксели, как в Canvas в HTML5?

Каждый элемент canvas-это объект, который Tkinter отслеживает. Если вы очищаете экран, просто рисуя черный прямоугольник, то вы фактически создали утечку памяти, в конце концов, ваша программа рухнет из-за миллионов элементов, которые были разработаны.

Чтобы очистить холст, используйте удалить метод. Дайте ему специальный параметр в «всех» чтобы удалить все предметы на холсте (строка в «всех» » это специальный тег, который представляет все элементы на холсте):

Если вы хотите удалить только определенные предметы на холсте (например, объекты на переднем плане, оставляя на заднем плане предметов на дисплее), вы можете назначить теги для каждого элемента. Затем, вместо»у всех», можно указать имя тега.

Если вы’вновь создавая игру, вы, вероятно, Дон’т необходимости удалить и воссоздать элементы. Например, если у вас есть объект, который движется по экрану, вы можете использовать переместить или координаты способ переместить элемент.

Источник

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

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