我想要一个带有下拉列表的条目菜单自动完成...例如,有点像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
?
答案 0 :(得分:1)
你是对的:原生菜单窃取了所有的事件,你无能为力。这是我们在OSX和Windows上使用本机菜单所付出的代价。
解决方法是不使用下拉菜单。相反,您可以创建Toplevel
的实例,打开overrideredirect
标志,然后自己管理所有事件。这是一件苦差事,但它是可行的。