Как навести курсор на изображение с помощью Canvas? TKinter

#python #python-3.x #user-interface #tkinter #tkinter-canvas

#python #python-3.x #пользовательский интерфейс #tkinter #tkinter-canvas

Вопрос:

У меня есть код, который отлично работает с виджетом Label, но я совершенно не понимаю, как преобразовать это в Canvas?

Это то, что код, который я пробовал.

 from tkinter import * 

def onObjectClick1(event):
    print("1")
    my_pic1 = PhotoImage(file="start000-before.png")
    obj1 = canv.create_image(50,50,image=my_pic1, anchor=NW)

def onObjectClick2(event):
    print("2")
    my_pic2 = PhotoImage(file="start000-after.png")
    obj2 = canv.create_image(50,50,image=my_pic2, anchor=NW)
    
root = Tk()    
canv = Canvas(root, width=300, height=300)
my_pic1 = PhotoImage(file="start000-before.png")
obj1 = canv.create_image(50,50,image=my_pic1, anchor=NW)
canv.tag_bind(obj1, '<Enter>', onObjectClick1)        
canv.tag_bind(obj1, '<Leave>', onObjectClick2)        
canv.pack()

root.mainloop()
 

Я новичок в Tkinter. Спасибо!

Комментарии:

1. Что вы подразумеваете под «наведением изображения»?

Ответ №1:

Я думаю, я понимаю, что вы хотите сделать, но есть две вещи, которые вы делаете неправильно. Первый связан с этим. Если вы определите локальную переменную внутри своей функции для сохранения объекта изображения, вы потеряете ее при выходе из функции. Во-вторых, вы создаете новые объекты поверх старого объекта, и тогда вы никогда не сможете снова «войти» в объект. Вместо этого вы можете использовать Canvas.itemconfig() для изменения изображения элемента, но будьте осторожны с этим, потому что при этом вы потеряете привязку элемента, поэтому вам нужно сделать это снова. Попробуйте это и посмотрите, соответствует ли это вашим ожиданиям:

 from tkinter import * 

def onObjectClick1(event):
    print("1")
    canv.itemconfig(obj1, image=my_pic2)
    canv.tag_bind(obj1, '<Leave>', onObjectClick2)     

def onObjectClick2(event):
    print("2")
    canv.itemconfig(obj1, image=my_pic1)
    canv.tag_bind(obj1, '<Enter>', onObjectClick1)        
    
root = Tk()    
canv = Canvas(root, width=300, height=300)
my_pic1 = PhotoImage(file="start000-before.png")
my_pic2 = PhotoImage(file="start000-after.png")

obj1 = canv.create_image(50,50,image=my_pic1, anchor=NW)
canv.tag_bind(obj1, '<Enter>', onObjectClick1)        
canv.tag_bind(obj1, '<Leave>', onObjectClick2)        
canv.pack()

root.mainloop()
 

Комментарии:

1. Огромное спасибо! Он работает именно так, как я хочу. Я хочу спросить еще одну вещь: возможно ли обеспечить переход к изображению внутри холста?

2. Да, но вам придется программировать это вручную. Точно так же, как вы можете изменить изображение, вы можете переместить его

3. Но я слишком много думаю об этом, и tkinter — не лучший инструмент, если вы хотите выполнять продвинутый дизайн, такой как современные веб-страницы html. Конечно, вы можете это сделать, но какой ценой?