Удаление всего, отдельного элемента, группы элементов

Рассмотрим удаление элементов на холсте.
Для удаления будем использовать метод 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()

Заданий не будет. Редко, но так бывает.

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

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