Как выполнить функцию при нажатии на canvas_image в Tkinter, не испортив графический интерфейс?

#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 .. ie Left Click . Однако это, вероятно, не решит вашу проблему. При нажатии он быстро переключится на любые цвета, которые вы установили для «активного» состояния. Потенциально лучшим способом было бы использовать ttk и map изображения для каждого состояния кнопки.

4. Большое спасибо за быстрое решение! Но теперь он показывает мне эту ошибку TypeError: on_click() takes 0 positional arguments but 1 was given

5. Эта ошибка связана с тем, что вы не включили event аргумент, как вы это делали для других своих функций. Ответ отредактирован, чтобы показать стандартный способ.