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

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

canvas.create_rectangle(10, 10, 50, 50, color="green")

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

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

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

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

3 ответов


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

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

canvas.delete("all")

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

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


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

от Фредрика Лундха введение в Tkinter:

обратите внимание, что элементы, добавленные на холст, сохраняются до их удаления. Если вы хотите изменить чертеж, вы можете использовать такие методы, как coords, itemconfig и move изменить элементы, или использовать delete в удалить их.


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