Python tkinter菜单栏和复选框保持打开状态

Python tkinter菜单栏和复选框保持打开状态,python,tkinter,Python,Tkinter,我正在菜单栏中的一个菜单栏中制作菜单栏,我有一些check_按钮,当其中一个check_按钮被单击时,菜单关闭,但我想保持此菜单打开。我想知道是否有一种简单的方法。我正在制作一个地图编辑器,并在我的菜单中选择显示或不显示地图的元素 menubar = tk.Menu() viewMenu = tk.Menu(menubar, tearoff = 0) viewMenu.add_check_button(label = "Obstacles", varibale = test1) viewMenu

我正在菜单栏中的一个菜单栏中制作菜单栏,我有一些
check_按钮
,当其中一个
check_按钮
被单击时,菜单关闭,但我想保持此菜单打开。我想知道是否有一种简单的方法。我正在制作一个地图编辑器,并在我的菜单中选择显示或不显示地图的元素

menubar = tk.Menu()
viewMenu = tk.Menu(menubar, tearoff = 0)
viewMenu.add_check_button(label = "Obstacles", varibale = test1)
viewMenu.add_check_button(label = "Ground", varibale = test2)
menubar.add_cascade(menu = viewMenu, label = "View")
win.config(menu = menubar) # win = tk.Tk()

下面的示例在每次选择checkbutton时打开View back:

import tkinter as tk

root = tk.Tk()

test1, test2 = tk.BooleanVar(), tk.BooleanVar()

def cb():
    print(test1.get(), test2.get())
    root.tk.call('::tk::TraverseToMenu', root, 'v')

menubar = tk.Menu(root)
viewMenu = tk.Menu(menubar, tearoff = 0)
viewMenu.add_checkbutton(label = "Obstacles", variable = test1, command=cb)
viewMenu.add_checkbutton(label = "Ground", variable = test2, command=cb)
menubar.add_cascade(menu = viewMenu, label = "View")
root.config(menu = menubar) # win = tk.Tk()

root.mainloop()
请参阅更多信息和


根据windows的特殊情况的答案,可以编写一个非常类似的代码,如下所示:

import tkinter as tk

root = tk.Tk()

if root._windowingsystem == 'win32':
    import ctypes

    keybd_event = ctypes.windll.user32.keybd_event
    alt_key = 0x12
    key_up = 0x0002

    def traverse_to_menu(key=''):
        if key:
            ansi_key = ord(key.upper())
            #   press alt + key
            keybd_event(alt_key, 0, 0, 0)
            keybd_event(ansi_key, 0, 0, 0)

            #   release alt + key
            keybd_event(ansi_key, 0, key_up, 0)
            keybd_event(alt_key, 0, key_up, 0)

else:
    #   root._windowingsystem == 'x11'
    def traverse_to_menu(key=''):
        root.tk.call('tk::TraverseToMenu', root, key)

test1, test2 = tk.BooleanVar(), tk.BooleanVar()
menubar = tk.Menu(root)
viewMenu = tk.Menu(menubar, tearoff = 0)
viewMenu.add_checkbutton(label = "Obstacles", variable = test1,
                            command=lambda : traverse_to_menu('v'))
viewMenu.add_checkbutton(label = "Ground", variable = test2,
                            command=lambda : traverse_to_menu('v'))
menubar.add_cascade(menu = viewMenu, label = "View")
root.config(menu = menubar) # win = tk.Tk()

root.mainloop()

当Alt-v通过键盘打开菜单时,
遍历菜单的变量
'v'
。正如在
中一样,键
需要是默认情况下使用键盘打开菜单的非修改键。

是否可以包含创建菜单的代码片段,以便我们可以查看您目前拥有的内容?这样,想要帮助您的人就不必从头开始。请在您的问题中包含一个。顺便说一句:菜单有选项
tearoff
,所以您可以删除菜单(从菜单栏中删除),它可以作为弹出菜单保留。至少它可以在Linux上工作。@furas-thx它可以工作但不是很漂亮:/maybe它不是很漂亮,但它可以工作;)我认为保持菜单打开需要很多很多工作,或者你可能需要从头开始编写所有菜单。但我可能错了。我只是在Py3下运行了这个,在点击其中一个复选按钮后,我没有看到viewMenu重新出现。。。少了什么吗?一、 同样,我在Windows上(10)。从我在您参考的两个链接中看到的情况来看,运行Linux的人似乎在这方面运气更好。我确实尝试过将tearoff设置为1,但没有效果。@Gary02127多亏了的,我能够轻松地修改他们的代码,在这里提供答案。