Python Tkinter:在发布菜单时有条目接收键吗?

时间:2016-01-15 16:23:46

标签: python tkinter tk

我想要一个带有下拉列表的条目菜单自动完成...例如,有点像Chrome的omnibar。

我遇到的一个问题是,一旦菜单被发布(显示),它似乎拦截了所有按键事件,我看不到将它们重定向到其他地方的方法。

以下是一些重现问题的简化代码:

from Tkinter import Entry, Menu, Tk

def menuKey(event):
    print('Key pressed in a menu.')

def showMenu(event):
    menu = Menu(root, tearoff = 0)
    menu.add_command(label = 'Just for example')
    menu.bind('<KeyRelease>', menuKey)
    menu.post(entry.winfo_rootx(), entry.winfo_rooty() + entry.winfo_height())

root  = Tk()
entry = Entry(root, width = 50)
entry.bind('<KeyRelease>', showMenu)
entry.bind('<FocusIn>', showMenu)
entry.pack()
root.mainloop()

单击条目后会显示菜单。尝试输入。在Windows上,您只会收到错误的哔声。在OS X上,它突出显示菜单中的内容。操作系统都没有实现我真正想要的功能,即运行menuKey功能。

我是否有某种方法可以拦截转到Menu的关键事件和/或强制他们转到Entry

1 个答案:

答案 0 :(得分:1)

你是对的:原生菜单窃取了所有的事件,你无能为力。这是我们在OSX和Windows上使用本机菜单所付出的代价。

解决方法是不使用下拉菜单。相反,您可以创建Toplevel的实例,打开overrideredirect标志,然后自己管理所有事件。这是一件苦差事,但它是可行的。