Держите меню открытым в Tkinter - PullRequest
4 голосов
/ 30 августа 2011

Я хочу оставить каскад меню открытым, после того как нажата командная кнопка внутри каскада.Таким образом, он в основном закрывается только тогда, когда пользователь щелкает в другом месте (как обычно, тоже).Не могу найти подходящую опцию или метод, чтобы открыть упомянутое меню в обратном вызове.Функция invoke () работает только на кнопках с каскадом, верно?Как бы вы поступили об этом?

1 Ответ

3 голосов
/ 04 мая 2012

Да, я знаю, что об этом спрашивали давным-давно, но мне было любопытно, есть ли какой-нибудь способ сделать это с помощью tkinter, поэтому я немного покопался и выяснил, как это сделать.Мне не удалось найти способ правильно разместить постоянное меню там, где оно было, когда оно первоначально открывалось, но мне удалось сохранить его в любом месте, которое вы запрашиваете (я использую левый верхний угол корневого окна).И да, я знаю, что это не очень хорошая правильная реализация на основе классов, но я просто собирался сделать такой простой тест, какой только мог написать, не затеняя его слишком большим количеством посторонних деталей.

try:
    from tkinter import *
    from tkinter.ttk import *
except:
    from Tkinter import *
    from ttk import *

root = Tk()
var = StringVar()

def menu_click(menu, item):
    global root
    var.set(item)
    menu.post(root.winfo_rootx(), root.winfo_rooty())

root.option_add('*tearOff', False)  # remove tearoff from all menus
Label(root, textvariable=var).pack()  # just to give menu clicks some feedback
root.geometry('400x300')
menubar = Menu(root)
root['menu'] = menubar
menu_test = Menu(menubar)
menubar.add_cascade(menu=menu_test, label='Test')
menu_test.add_command(label='One', command=lambda: menu_click(menu_test, 'One'))
menu_test.add_command(label='Two', command=lambda: menu_click(menu_test, 'Two'))
menu_test.add_command(label='Three', command=lambda: menu_click(menu_test, 'Three'))
menu_cas = Menu(menu_test)
menu_test.add_cascade(menu=menu_cas, label='Four')
menu_cas.add_command(label='One', command=lambda: menu_click(menu_cas, 'Fourty One'))
menu_cas.add_command(label='Two', command=lambda: menu_click(menu_cas, 'Fourty Two'))
menu_cas.add_command(label='Three', command=lambda: menu_click(menu_cas, 'Fourty Three'))
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...