Python tkinter列表框项目绑定

Python tkinter列表框项目绑定,python,listbox,tkinter,bind,Python,Listbox,Tkinter,Bind,我试图在右键单击Listbox小部件中的项目时显示上下文菜单。 问题是,如果绑定到列表框,则整个列表框将在发送事件时处于活动状态,并且似乎不可能仅绑定到列表项。我不能使用,因为它将在左键单击时触发。因此,我尝试使用方法curselection(),但我遇到了不想要的结果(不必选择右键单击的项目)。我想我需要使用generate\u event()和nearest()模拟。有人能告诉我怎么做吗?或者我在哪里可以找到tkinter包中的默认绑定?您需要使用最近的(event.y)。绑定到右键单击并在

我试图在右键单击Listbox小部件中的项目时显示上下文菜单。
问题是,如果绑定到列表框,则整个列表框将在发送事件时处于活动状态,并且似乎不可能仅绑定到列表项。我不能使用
,因为它将在左键单击时触发。因此,我尝试使用方法
curselection()
,但我遇到了不想要的结果(不必选择右键单击的项目)。我想我需要使用
generate\u event()
nearest()
模拟
。有人能告诉我怎么做吗?或者我在哪里可以找到tkinter包中的默认绑定?

您需要使用
最近的(event.y)
。绑定到右键单击并在调用回调时弹出菜单

import Tkinter

def context_menu(event, menu):
    widget = event.widget
    index = widget.nearest(event.y)
    _, yoffset, _, height = widget.bbox(index)
    if event.y > height + yoffset + 5: # XXX 5 is a niceness factor :)
        # Outside of widget.
        return
    item = widget.get(index)
    print "Do something with", index, item
    menu.post(event.x_root, event.y_root)

root = Tkinter.Tk()
aqua = root.tk.call('tk', 'windowingsystem') == 'aqua'

menu = Tkinter.Menu()
menu.add_command(label=u'hi')

listbox = Tkinter.Listbox()
listbox.insert(0, *range(1, 10, 2))
listbox.bind('<2>' if aqua else '<3>', lambda e: context_menu(e, menu))
listbox.pack()
root.mainloop()
导入Tkinter
def上下文菜单(事件、菜单):
widget=event.widget
index=widget.nearest(event.y)
_,yoffset,x,height=widget.bbox(索引)
如果event.y>height+yoffset+5:#xxx5是一个精确系数:)
#在widget之外。
返回
item=widget.get(索引)
打印“处理”,索引,项目
menu.post(event.x_root,event.y_root)
root=Tkinter.Tk()
aqua=root.tk.call('tk','windowingsystem')=='aqua'
menu=Tkinter.menu()
菜单.添加命令(label=u'hi')
listbox=Tkinter.listbox()
列表框。插入(0,*范围(1、10、2))
listbox.bind(“”if aqua else“”,lambda e:context_菜单(e,菜单))
listbox.pack()
root.mainloop()

如果您在空白处单击,菜单也将发布。必须有一种方法只在单击项目时显示它。
是如何工作的?有可能超载它吗?你所指的空白空间属于列表框,所以是预期的。您只需将
Listbox
的高度设置为它拥有的项目数:
Listbox=Tkinter.Listbox(高度=5)
。你不能“过载”你正在关注的事件,这也无关紧要,因为你想在用户不点击项目的情况下显示一个弹出菜单。谢谢。@Rnhmjoj顺便说一句,更新后的答案并不依赖于修改高度。