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

时间:2017-12-19 21:04:24

标签: python tkinter

我正在菜单栏的其中一个菜单栏中的tkinter中创建菜单栏,我有一些check_button,当点击其中一个check_button时,菜单会关闭,但是我想保持这个菜单打开。我想知道是否有一种简单的方法。我正在制作地图编辑器,在我的菜单中,我选择显示或不显示地图元素。

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()

2 个答案:

答案 0 :(得分:0)

下面的示例打开每次选中一个复选按钮时返回:

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()

查看更多信息herehere

基于对窗口的解释'特殊情况here一个非常相似的代码可以编写如下:

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()

key的{​​{1}}变量为traverse_to_menu,因为 Alt - V 通过键盘打开菜单。因为'v'需要是非修改键,默认情况下使用键盘打开菜单。

答案 1 :(得分:0)

就我而言,我是这样做的:

首先将主要事物创建为

window=Tk()
mb = Menubutton (window, text="Test", relief=RAISED)
var = BooleanVar()

然后添加一些检查按钮如下:

mb.menu.add_checkbutton(label='Test btn', variable=var,command = lambda: menu_click("some input"))
#adding some other checkbuttons

最终创建 menu_click 函数:

def menu_click(input):
   if input == "some input":
      mb.menu.post(mb.winfo_rootx(), mb.winfo_rooty())

其中 mb.winfo_rootx(), mb.winfo_rooty() 是所需 opennig 位置的 x 和 y 坐标。