在Tkinter中保持菜单打开状态

4

当级联菜单中的命令按钮被点击后,我希望能保持该级联菜单的打开状态。因此,它基本上只有在用户点击其他任何地方时才会关闭(就像通常情况下一样)。但是在回调函数中找不到适当的选项或方法来打开所述菜单。 invoke() 函数只适用于级联菜单内的按钮,对吗?你怎么处理这个问题?

1个回答

3

是的,我知道这个问题很久以前就被问了,但是我很好奇是否有任何方法可以用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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接