【问题标题】:How to bind events to Canvas items?如何将事件绑定到 Canvas 项目?
【发布时间】:2011-02-16 17:31:21
【问题描述】:

如果我使用画布来显示数据,并且我希望用户能够单击画布上的各种项目以获取更多信息或以某种方式与之交互,那么最好的方法是什么这个?

在线搜索我可以找到有关如何将事件绑定到标签的信息,但这似乎比我想要的更间接。我不想用标签对项目进行分组,而是在用户单击画布上的特定项目时进行特定的函数调用。

【问题讨论】:

    标签: python user-interface tkinter tkinter-canvas


    【解决方案1】:

    要与包含在Canvas 对象中的对象进行交互,您需要使用tag_bind(),其格式如下:tag_bind(item, event=None, callback=None, add=None)

    item参数可以是标签也可以是id。

    这里有一个例子来说明这个概念:

    from tkinter import * 
    
    def onObjectClick(event):                  
        print('Got object click', event.x, event.y)
        print(event.widget.find_closest(event.x, event.y))
    
    root = Tk()
    canv = Canvas(root, width=100, height=100)
    obj1Id = canv.create_line(0, 30, 100, 30, width=5, tags="obj1Tag")
    obj2Id = canv.create_text(50, 70, text='Click', tags='obj2Tag')
    
    canv.tag_bind(obj1Id, '<ButtonPress-1>', onObjectClick)       
    canv.tag_bind('obj2Tag', '<ButtonPress-1>', onObjectClick)   
    print('obj1Id: ', obj1Id)
    print('obj2Id: ', obj2Id)
    canv.pack()
    root.mainloop()
    

    【讨论】:

    • 很好的例子。我喜欢你展示 id 和 tag 的用法,并使用 obj1Idobj1Tag 之类的名称来说明问题。
    • 为什么你用event.widget.find_closest(event.x, event.y)而不是event.widget.find_withtag('current')[0] 使用find_closest如果有重叠项可能会有问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多