tkinter列表框项目绑定

时间:2013-02-13 21:19:46

标签: python listbox tkinter bind

我正在尝试在右键单击列表框小部件中的项目时显示上下文菜单。 问题是如果绑定到列表框,整个列表框将处于活动状态以发送事件,并且似乎无法仅绑定到列表项。我无法使用<<ListboxSelect>>因为它会在左键单击时被触发。所以我尝试使用方法curselection(),但我陷入了不必要的结果(不必选择右键单击项)。我想我需要使用<<ListboxSelect>>generate_event()来模拟nearest()。有人可以告诉我该怎么做或者我在哪里可以找到tkinter包内的默认绑定?

1 个答案:

答案 0 :(得分:2)

您需要使用nearest(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()