tkinter Listbox 项目绑定

2 投票
1 回答
4874 浏览
提问于 2025-04-17 15:48

我想在一个列表框(Listbox)里,当右键点击某个项目时显示一个上下文菜单。问题是,如果我把事件绑定到整个列表框上,那么整个列表框都会响应这个事件,而不能只针对列表中的某个项目。我不能使用 <<ListboxSelect>>,因为它是在左键点击时触发的。所以我尝试使用 curselection() 方法,但结果不太理想(因为右键点击的项目不一定是被选中的)。我觉得我需要用 generate_event()nearest() 来模拟 <<ListboxSelect>>。有人能告诉我怎么做,或者在哪里可以找到 tkinter 包里的默认绑定吗?

1 个回答

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()

撰写回答