Python Tkinter: есть ли входные ключи, пока выдается меню?
Я хочу иметь запись с выпадающим меню автозаполнения... вроде как омнибар 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 это выделяет что-то в меню. Ни одна ОС не делает то, что я на самом деле хочу, то есть иметь menuKey
функция запуска.
Есть ли способ, которым я могу перехватить ключевые события, которые идут на Menu
и / или заставить их пойти в Entry
вместо?
1 ответ
Вы правы: родные меню крадут все события, и вы ничего не можете с этим поделать. Это цена, которую мы платим за наличие собственных меню в OSX и Windows.
Обходной путь - не использовать меню для выпадающего списка. Вместо этого вы можете создать экземпляр Toplevel
, включите overrideredirect
флаг, а затем управлять всеми событиями самостоятельно. Это немного хлопотно, но выполнимо.