#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. Конечно, вы можете это сделать, но какой ценой?