Hello! There is such code:

from tkinter import * from PIL import Image, ImageTk root = Tk() c = Canvas(width=500,height=300,bg="white",cursor="pencil") pilImage = Image.open("notaall.png") DO = ImageTk.PhotoImage(pilImage) c.create_image(100,150,image = DO) c.create_image(100,200,image = DO) c.create_image(100,250,image = DO) c.pack() root.mainloop() 

How to click on the image select it and for example delete? You only need to delete one of the 3 notes.

    2 answers 2

    Working code with explanations:

     ... # Чтобы все работало правильно, нужно добавить отдельный тег для всех изображений (пусть будет 'image') c.create_image(100, 150, image = DO, tags='image') c.create_image(100, 200, image = DO, tags='image') c.create_image(100, 250, image = DO, tags='image') c.pack() # Добавляем реакцию на клик мышью на канве selected = None def canvas_on_click(event): global selected # Находим все объекты на canvas в данной точке overlap_items = c.find_overlapping(event.x, event.y, event.x, event.y) # Оставляем только объекты с тегом image (мы же не хотим, чтобы можно было выделить рамку выделения?) overlap_items = tuple(_id for _id in overlap_items if 'image' in c.gettags(_id)) if overlap_items: # Объектов в точке может быть несколько, берем первый попавшийся item = overlap_items[0] selected = item bbox = c.bbox(item) # получаем ограничивающий прямоугольник объекта (bounding box) c.delete('selection') # Удаляем старую рамку выделения (все объекты с тегом "selection") c.create_rectangle(*bbox, outline='red', width=2, tags='selection') # Добавляем рамку выделения else: # Клик мимо объектов selected = None # Ничего не выделено c.delete('selection') # Удаляем рамку выделения c.bind('<1>', canvas_on_click) # Удаление выделенного элемента нажатием на кнопку def remove_selected(): # Если что-то выделено - удаляем if selected is not None: c.delete(selected) # Удаляем выделенный объект (по его id) c.delete('selection') # Удаляем рамку выделения (по тегу) b = Button(root, text='Remove', command=remove_selected) b.pack() root.mainloop() 
    • Thank you very much. But there is one question. You can comment (in more detail) this line of code: overlap_items = tuple (_id for _id in overlap_items if 'image' in c.itemcget (_id, 'tags')) @ insolor - Raccoon
    • @Raccoon, literally, create a tuple consisting of _id from the overlap_items set, for which the condition is 'image' in c.itemcget(_id, 'tags') (i.e., the tag set of the object with this id includes the 'image' tag) . - insolor
    • Honestly thank you so much. Many unknowns in your code, I will teach and pull up the level. @ Insolor - Raccoon
     c.bind('<Button-1>', lambda event: event.widget.delete('all')) 
    • Thank. But it removes everything. I only need what I click on. Can you tell me how to do this? @Sergey Gornostaev - Raccoon