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 флаг, а затем управлять всеми событиями самостоятельно. Это немного хлопотно, но выполнимо.

Другие вопросы по тегам