Привязка клавиш виджета Tkinter Menubutton для открытия элементов виджета меню в том же окне

Я создал подменю внутри меню, используя виджеты Menubutton и Menu:

from tkinter import *
root = Tk()

def f(event):
    submenu.invoke(0)

mainmenu = Menubutton(root, text="Menu")
mainmenu.pack()

submenu = Menu(mainmenu)
mainmenu.config(menu=submenu)

submenu.add_command(label="Option 1")
submenu.add_command(label="Option 2")

Теперь я хочу добавить привязку клавиш к своему меню:

mainmenu.bind("<Key>", f)
mainmenu.focus_set()

Это работает как шарм: когда я нажимаю клавишу, открывается подменю. Но проблема в том, что подменю открывается как оторванное окно верхнего уровня. Но я хочу, чтобы он открывался в одном окне с меню. Я добавил tearoff=0 в submenu (так получилось: submenu = Menu(mainmenu, tearoff=0)). Но теперь он ничего не возвращает. Я пытаюсь понять, почему это не так. Может я что-то делаю не так ...
Я искал решение, но ни одно из них не решает проблему. Все, что они говорят, это просто добавление привязки клавиш, которая что-то распечатывает, однако мне нужна привязка клавиш, которая как бы автоматически нажимает на элемент меню и всплывает элементы элемента, но не как отдельное окно (может быть, это называется contextmenu?) . Я нигде не мог найти решение этой конкретной проблемы.
Итак, как я могу это сделать? Любая помощь будет оценена.


person Parviz Karimli    schedule 30.07.2016    source источник
comment
Похоже, вы спрашиваете, как создать меню, которое на самом деле не является меню? Если это не всплывающее окно. как вы ожидаете, что это появится? Что вы имеете в виду, открывая в одном окне с меню?   -  person Bryan Oakley    schedule 30.07.2016
comment
Хочу, чтобы подменю не оторвалось.   -  person Parviz Karimli    schedule 30.07.2016
comment
Опять же, когда я не использую tearoff=0, он работает как шарм, но когда я добавляю эту функцию, он ничего не возвращает. Это странно.   -  person Parviz Karimli    schedule 30.07.2016


Ответы (1)


я думаю

def f(event):
    submenu.post(mainmenu.winfo_rootx(), 
                 mainmenu.winfo_rooty() + mainmenu.winfo_height())

делает то, что вы хотите, даже с опцией tearoff=False.

person j_4321    schedule 30.07.2016
comment
На данный момент это лучшее решение. Мне пришлось включить это в свой код. Я действительно ожидаю более естественного пути. - person Parviz Karimli; 30.07.2016