在Tkinter中保持菜单打开

5 投票
1 回答
2128 浏览
提问于 2025-04-17 00:41

我想在点击级联菜单中的一个命令按钮后,让这个菜单保持打开状态。也就是说,只有当用户点击其他地方时,这个菜单才会关闭(就像平常一样)。我找不到合适的选项或者方法来在回调中打开这个菜单。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()

撰写回答