Python Tkinter:在发布菜单时条目是否接收密钥?

Python Tkinter: Have Entry receive keys while Menu is posted?

我想要一个带有下拉菜单自动完成功能的条目...有点像 Chrome 的多功能栏,例如。

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

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

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 上,它突出显示菜单中的内容。 OS 都没有做我真正想要的,即 menuKey 函数 运行.

有什么方法可以拦截将要转到 Menu and/or 的关键事件,迫使它们转到 Entry

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

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