2013-10-25 3 views
1

Я рисую много движущихся частиц в стационарной коробке с Tkinter. Мой ящик всегда присутствует и не меняется с течением времени, в то время как частицы нужно обновлять.Как выборочно удалять чертежи в Tkinter?

Моей первой интуицией является удаление ВСЕХ вещей (как частиц, так и коробки), а затем перерисовать все.

canvas.delete(ALL) 

Это действительно работает , но обновления кадра получить очень медленно. Это связано с тем, что мой ящик имеет неправильную форму, что означает, что я должен нарисовать квадрат точками. Таким образом, этот метод delete-everything-and-redraw-all является неудовлетворительным.

Я желаю, чтобы поле обращается только один раз и только частицы удаляются и перерисовывается (обновлено). Как мне это сделать?

ответ

0

Предположим, у вас есть прямоугольник на canvas:

canvas.create_rectangle(x0, y0, x1, y1) 

Это возвращает handle, так что если вы следить за ним,

myRectangle = canvas.create_rectangle(x0, y0, x1, y1) 
canvas.delete(myRectangle) 

Это удалит только объект myRectangle.

Другой способ сделать это - использовать теги.

canvas.create_rectangle(x0, y0, x1, y1, tags="myRectangle") 
canvas.delete("myRectangle") 
+0

+1 и спасибо. Сложность в том, что, как я уже упоминал, моя коробка имеет неправильные формы. Поэтому я рисую окно, выкладывая много точек. Поэтому, используя этот метод, у меня будут тысячи ручек ... –

+0

Что вы хотите обновить? У вас всегда есть itemconfig или config, чтобы помочь вам переконфигурировать элемент, и вам не нужно его перерисовывать. – octref

+0

Я не совсем понимаю, зачем вам нужно «нарисовать квадрат точки точкой», так как Tkinter имеет метод create_polygon, как я помню. Можете ли вы подробнее рассказать о своем вопросе? (Включая изображение, чтобы проиллюстрировать вашу проблему). – octref

0

Что вам нужно сделать, это присвоить чертежам переменные, а затем удалить их. Ниже сценарий демонстрирует это:

from Tkinter import Button, Canvas, Tk 

root = Tk() 

canvas = Canvas() 
canvas.grid() 

drawing1 = canvas.create_oval((10,50,20,60), fill="red") 
drawing2 = canvas.create_oval((30,70,40,80), fill="blue") 

Button(text="Kill 1", command=lambda: canvas.delete(drawing1)).grid() 
Button(text="Kill 2", command=lambda: canvas.delete(drawing2)).grid() 

root.mainloop() 

В дополнение к ALL, метод delete может также принять конкретный рисунок.

+0

+1 и thx! Сложность в том, что, как я уже упоминал, моя коробка имеет неправильные формы. Поэтому я рисую окно, выкладывая много точек. Поэтому, используя этот метод, у меня будут тысячи ручек ... –

+0

@mavErick - Ну почему бы не составить список, а затем добавить каждую точку в список? Затем вы можете удалить их по индексу. Например, 'canvas.delete (mylist [45])' удалит точку 46 (помните, что индексы Python начинаются с 0). Я знаю, что это будет немного громоздким, но это должно быть намного быстрее, чем удалять каждую точку, а затем перерисовывать их все время. – iCodez

+0

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

Смежные вопросы