有没有类似OptionMenu的可以嵌套的Tkinter控件?

0 投票
2 回答
2055 浏览
提问于 2025-04-18 10:43

我想做一个类似于选项菜单的列表选择器,但我希望能够有嵌套的选项。也就是说,我想让它像一个嵌套菜单那样工作(比如文件->保存),但我需要把它做成网格的形式。

如果这样做不行(除了自己写一个自定义的控件),我可能就得用两个选择器,第一个选择“主菜单”,第二个选择“子菜单”,但我真的不想这样做。

2 个回答

3

对上面的代码进行改进,以支持更长的菜单。享受递归的乐趣。

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):

        def create_menu( top_info, top_menu, value_var):
            if isinstance(top_info, dict):
                print "Evaluating dictionary with keys:"
                for key in top_info.keys():
                    print 'Key:' + key
                    menu = tk.Menu(top_menu)
                    top_menu.add_cascade(label=key, menu=menu)
                    create_menu(top_info[key], menu, value_var)
                return
            else:
                print "Evaluating list of values:"
                for value in top_info:
                    print 'Value:' + value
                    top_menu.add_radiobutton(label=value, variable = value_var, value=value)
                return

        tk.Frame.__init__(self, parent)

        items = {"one": {"a":["aa","aaa","aaaa"],"b":["bb","bb"],"c":["cc"] },
                 "two": ["d","e","f"],
                 "three": ["g","h","i"]}

        self.the_value = tk.StringVar()
        self.the_value.set("a")

        self.menubutton = tk.Menubutton(self, textvariable=self.the_value, indicatoron=True)
        self.topMenu = tk.Menu(self.menubutton, tearoff=False)
        self.menubutton.configure(menu=self.topMenu)

        create_menu(items, self.topMenu, self.the_value)

        self.menubutton.pack()

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
6

选项菜单其实就是一个方便的功能,它可以帮你创建一个菜单按钮和一个菜单。其实你自己也可以很简单地做到这一点。下面是一个例子:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        items = {"one": ["a","b","c"],
                 "two": ["d","e","f"],
                 "three": ["g","h","i"]}

        self.the_value = tk.StringVar()
        self.the_value.set("a")

        self.menubutton = tk.Menubutton(self, textvariable=self.the_value, indicatoron=True)
        self.topMenu = tk.Menu(self.menubutton, tearoff=False)
        self.menubutton.configure(menu=self.topMenu)

        for key in sorted(items.keys()):
            menu = tk.Menu(self.topMenu)
            self.topMenu.add_cascade(label=key, menu=menu)
            for value in items[key]:
                menu.add_radiobutton(label=value, variable = self.the_value, value=value)

        self.menubutton.pack()

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

撰写回答