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()