Tkinter TopLevel中的OptionMenu无法正常工作

0 投票
1 回答
876 浏览
提问于 2025-04-18 01:47

基本上,我有这段代码:

class Top(Frame):
    def __init__(self,master):
        Frame.__init__(self,master)
        self.num = 10
        self.items = range(6)
        self.pack()
        self.widgets()

    def widgets(self):
        menu = Toplevel()
        frame = Frame(menu,padx=5,pady=5)

        variables = []
        menus = []
        callbacks = []

        def assign():
            pass

        for i in range(self.num):
            Label(frame,text=str(i)).grid(sticky='W',row = i,column=0)
            variables.append(StringVar(""))
            menus.append(OptionMenu(frame,variables[i],""))
            callbacks.append(assign)
            menus[i].configure(width=10)
            menus[i].grid(sticky='W',row = i,column=1)
            for item in self.items:
                menus[i]["menu"].add_command(label=str(item),command=callbacks[i])
                variables[i].set(str(i*i))
        frame.grid()
        menu.grid()

root = Tk()
top = Top(root)
top.mainloop()

现在,当我点击其中一个条目时,它并没有切换到这个特定的条目。我忽略了什么呢?之所以这样结构化,是因为条目的数量以及对应的选项菜单和回调函数在每次调用时都是动态变化的。另外,如果条目确实发生了变化,获取当前条目的最佳方法是什么?

问候,Kai

1 个回答

1

你没有正确使用 OptionMenu。你把它自带的功能都去掉了。正确创建 OptionMenu 的方法是在创建这个小部件的时候,把所有的选项都给它。内部,OptionMenu 会利用每个菜单项的 command 属性来管理选中的值。如果你自己创建菜单项并设置了自己的命令,这样会导致这个小部件无法正常工作。

自己创建一个带菜单的按钮(其实 OptionMenu 就是这个意思)是没问题的,但如果你这么做,就需要自己确保按钮上的标签和选中的值是匹配的。如果你想要它自动工作的效果,就需要按照它的设计方式来使用 OptionMenu

你可以在这里找到一个不错的教程:http://effbot.org/tkinterbook/optionmenu.htm

撰写回答