#python #python-3.x #user-interface #tkinter #tkinter-canvas
#python #python-3.x #пользовательский интерфейс #tkinter #tkinter-холст
Вопрос:
У меня есть код, который изменяет изображение с my_pic1
на my_pic2
на при наведении на него курсора и работает нормально, но что мне делать, если я хочу выполнить on_click
функцию, когда пользователь нажимает на изображение ( my_pic1
) ?
from tkinter import *
def on_click():
print('clicked')
def onObjectClick1(event):
canv.itemconfig(obj1, image=my_pic2)
canv.tag_bind(obj1, '<Leave>', onObjectClick2)
def onObjectClick2(event):
canv.itemconfig(obj1, image=my_pic1)
canv.tag_bind(obj1, '<Enter>', onObjectClick1)
root = Tk()
canv = Canvas(root, width=300, height=300)
background = PhotoImage(file="background.gif")
canv.create_image(300,300,image=background)
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()
Я использовал Button
, но он дает фон изображения в белом цвете, что портит внешний вид графического интерфейса.
Это мой код после добавления кнопки,
from tkinter import *
def on_click():
print('clicked')
root = Tk()
canv = Canvas(root, width=300, height=300)
canv.pack()
background = PhotoImage(file="background.gif")
canv.create_image(300,300,image=background)
my_pic1 = PhotoImage(file="start000-before.png")
my_pic2 = PhotoImage(file="start000-after.png")
btn = Button(canv, image=my_pic1, command=on_click)
btn.bind('<Enter>', lambda e: btn.config(image=my_pic2))
btn.bind('<Leave>', lambda e: btn.config(image=my_pic1))
canv.create_window(50, 50, window=btn, anchor=NW)
root.mainloop()
Я очень новичок в Tkinter! Пожалуйста, помогите мне!!!!
Ответ №1:
Событие для щелчка левой кнопкой мыши — «<1>», поэтому:
from tkinter import *
def on_click(event=None): # add the event parameter
print('clicked')
def onObjectClick1(event=None):
canv.itemconfig(obj1, image=my_pic2)
def onObjectClick2(event=None):
canv.itemconfig(obj1, image=my_pic1)
root = Tk()
canv = Canvas(root, width=300, height=300)
background = PhotoImage(file="background.gif")
canv.create_image(300,300,image=background)
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.tag_bind(obj1, '<1>', on_click)
canv.pack()
root.mainloop()
Комментарии:
1. Я не понял?
'<1>'
что он делает?2. Точно так же, как событие «<Enter>» запускает функцию onObjectClick1 при наведении курсора мыши, событие «<1>» запускает функцию on_click.
3. @sodmzs1 —
1
это сокращение отButton-1
.. ieLeft Click
. Однако это, вероятно, не решит вашу проблему. При нажатии он быстро переключится на любые цвета, которые вы установили для «активного» состояния. Потенциально лучшим способом было бы использоватьttk
иmap
изображения для каждого состояния кнопки.4. Большое спасибо за быстрое решение! Но теперь он показывает мне эту ошибку
TypeError: on_click() takes 0 positional arguments but 1 was given
5. Эта ошибка связана с тем, что вы не включили
event
аргумент, как вы это делали для других своих функций. Ответ отредактирован, чтобы показать стандартный способ.