如何使用Tkinter将事件绑定附加到画布上的项目?

Ian*_*Ian 25 python user-interface tkinter tkinter-canvas

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

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

tde*_*cko 62

要与Canvas对象中包含的对象进行交互,您需要使用具有以下格式的tag_bind(): tag_bind(item, event=None, callback, 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()
Run Code Online (Sandbox Code Playgroud)

  • 很好的例子.我喜欢你如何展示id和tag的使用,并使用像'obj1Id`和`obj1Tag`这样的名字来驱动点回家. (8认同)
  • 为什么使用 `event.widget.find_closest(event.x, event.y)` 而不是 `event.widget.find_withtag('current')[0]` 如果存在重叠项目,使用 `find_closest` 可能会出现问题 (6认同)