Рассмотрим удаление элементов на холсте.
Для удаления будем использовать метод delete()
:
from tkinter import * from random import randrange as rnd root = Tk() root.geometry('600x600+1+1') canv = Canvas(bg='white') canv.pack(fill=BOTH,expand=1) def click(event): canv.delete(ALL) r = 40 x = event.x y = event.y canv.create_oval(x-r,y-r,x+r,y+r,fill='orange') canv.bind('<1>',click) mainloop()
canv.delete(ALL)
удаляет все объекты на холсте. Если нужно удалить не все, а только часть, то есть два пути: удалять по имени и удалять по тегу (метке)
Удаление по имени позволит удалить только один объект. А удаление по метке — сколько угодно, в том числе и один. Т.е. удаление по тегу (метке) удобнее. Удаление по имени мы рассмотрим позже, когда начнем работать с классами (ООП). А сейчас удаление по тегу:
from tkinter import * from random import randrange as rnd root = Tk() root.geometry('600x600+1+1') canv = Canvas(bg='white') canv.pack(fill=BOTH,expand=1) canv.create_line(0,0,500,500) def click(event): canv.delete('circle') r = 40 x = event.x y = event.y canv.create_oval(x-r,y-r,x+r,y+r,fill='orange',tag='circle') canv.bind('<1>',click) mainloop()
Сейчас мы увидели, что удаление по тегу удалило один объект.
Попробуйте изменить программу так:
from tkinter import * from random import randrange as rnd root = Tk() root.geometry('600x600+1+1') canv = Canvas(bg='white') canv.pack(fill=BOTH,expand=1) canv.create_line(0,0,500,500) def click(event): canv.delete('chupakabra') r = 40 x = event.x y = event.y canv.create_oval(x-r,y-r,x+r,y+r,fill='orange',tag='circle') canv.bind('<1>',click) mainloop()
Запустите программу и обратите внимание на то, что никакая ошибка не возникла, программа работает корректно, несмотря на то, что такой метки нет и никакие окружности не удалены. Но программа продолжает работать.
Удаление по имени, которого не существует, в отличие от этой ситуации, вызовет падение программы.
На это мы посмотрим чуть позже, а теперь удалим группу объектов по тегу:
(правая кнопка мыши удаляет красные круги, а левая — рисует 100 случайных кругов)
from tkinter import * from random import randrange as rnd, choice root = Tk() root.geometry('600x600+100+100') canv = Canvas(bg='white') canv.pack(fill=BOTH,expand=1) canv.create_line(0,0,500,500) def click(event): canv.delete('red') def draw(event): r = 7 for i in range(100): color = choice(['red','blue','green','yellow']) x = rnd(100,500) y = rnd(100,500) canv.create_oval(x-r,y-r,x+r,y+r,fill=color,tag=color) canv.bind('<1>',click) canv.bind('<3>',draw) mainloop()
Рассмотрим два примера.
Мышь перетаскивает шарик:
from tkinter import * from random import randrange as rnd, choice root = Tk() root.geometry('600x600+100+100') canv = Canvas(bg='white') canv.pack(fill=BOTH,expand=1) canv.create_line(0,0,500,500) def move(event): canv.delete('ff') r = 70 x = event.x y = event.y canv.create_oval(x-r,y-r,x+r,y+r,fill='orange', tag = 'ff') canv.bind('<Motion>',move) mainloop()
Заданий не будет. Редко, но так бывает.