【问题标题】:How to execute the function when click on canvas_image in Tkinter without spoiling the GUI?在 Tkinter 中单击 canvas_image 时如何在不破坏 GUI 的情况下执行该功能?
【发布时间】:2021-03-13 18:32:37
【问题描述】:

当光标悬停在图像上时,我有一个代码可以将图像从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,但它给图像背景提供了白色,这破坏了 GUI 的外观和感觉。

这是我添加按钮后的代码,

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 中很菜鸟!请帮帮我!!!!

【问题讨论】:

    标签: python python-3.x user-interface tkinter tkinter-canvas


    【解决方案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()
    

    【讨论】:

    • 我没听懂? '&lt;1&gt;' 它有什么作用?
    • 就像鼠标悬停时事件“”运行onObjectClick1函数一样,事件“”运行on_click函数。
    • @sodmzs1 - 1Button-1 的简写。即Left Click。不过,这可能无法解决您的问题。当您单击它时,它将快速切换到您为“活动”状态设置的任何颜色。一种可能更好的方法是将ttkmap 图像用于每个按钮状态。
    • 非常感谢您的快速解决方案!但现在它向我显示了这个错误TypeError: on_click() takes 0 positional arguments but 1 was given
    • 该错误是因为您没有像其他函数那样包含 event 参数。答案已编辑以显示标准方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多