【问题标题】:Updating OptionMenu from List从列表更新 OptionMenu
【发布时间】:2015-04-09 08:28:57
【问题描述】:

我的 GUI 中有一个由列表填充的 OptionMenu。每次用户运行某个进程时,列表都会更新以反映这一点。有没有办法根据列表更新 OptionMenu?我已经按照this question 尝试过self.plotWindow.update(),但无济于事。但是,关闭并重新打开窗口确实会刷新 OptionMenu,如您所料。相关代码:

if self.figNum.get() == 'New Figure...':
    if self.figList[-1] == 'New Figure...':
        self.figList.append(1)
    else:
        self.figList.append(self.figList[-1]+1)
    self.plotWindow.update() #tk.Tk() window
    self.i = self.figList[-1]
else:
    self.i = self.figNum.get()

【问题讨论】:

    标签: python python-3.x tkinter tkinter.optionmenu


    【解决方案1】:

    我相信更新 OptionMenu 的简单解决方案是使用类中内置的配置功能,如下所示:

    my_option_menu.configure(window, user_choice, *updated_list)
    

    【讨论】:

    • 对不起,你的例子中的 window 和 user_choice 是什么?
    【解决方案2】:

    OptionMenu 中的选项未绑定到创建它们的列表。因此,更改列表不会更改 OptionMenu,您必须自己更新它。

    您可以通过获取 OptionMenu 的 menu 并添加命令来做到这一点。以下示例显示了如何执行此操作(基于this answer)。

    它表明,即使self.options 列表使用“将选项添加到列表”按钮附加了一个选项,OptionMenu 也不会自动更改。要更新 OptionMenu,您可以为此使用“更新选项菜单”按钮,该按钮调用 self.update_option_menu。此函数从 OptionMenu 中删除所有选项,并为 self.options 中的每个项目插入一个新选项。

    import Tkinter as tk
    
    class App():
        def __init__(self, parent):
            self.parent = parent
            self.options = ['one', 'two', 'three']
    
            self.om_variable = tk.StringVar(self.parent)
            self.om_variable.set(self.options[0])
            self.om_variable.trace('w', self.option_select)
    
            self.om = tk.OptionMenu(self.parent, self.om_variable, *self.options)
            self.om.grid(column=0, row=0)
    
            self.label = tk.Label(self.parent, text='Enter new option')
            self.entry = tk.Entry(self.parent)
            self.button = tk.Button(self.parent, text='Add option to list', command=self.add_option)
    
            self.label.grid(column=1, row=0)
            self.entry.grid(column=1, row=1)
            self.button.grid(column=1, row=2)
    
            self.update_button = tk.Button(self.parent, text='Update option menu', command=self.update_option_menu)
            self.update_button.grid(column=0, row=2)
    
        def update_option_menu(self):
            menu = self.om["menu"]
            menu.delete(0, "end")
            for string in self.options:
                menu.add_command(label=string, 
                                 command=lambda value=string: self.om_variable.set(value))
    
        def add_option(self):
             self.options.append(self.entry.get())
             self.entry.delete(0, 'end')
             print self.options
    
        def option_select(self, *args):
            print self.om_variable.get()
    
    
    root = tk.Tk()
    App(root)
    root.mainloop()
    

    【讨论】:

    • 这太完美了,谢谢!我真的不明白为什么它会起作用(我尝试以不同的方式实现它,但它失败了)但它仍然有效,这对我来说已经足够了。
    • 哪一部分完全你不明白?我可以试着解释一下。
    • 主要是因为我们添加的是命令而不是字符串。 (虽然我猜因为我们做了command = lambda 它变成了一个不做任何事情的命令)。我指的是update_option_menu 函数,其他一切都有意义。
    • OptionMenu 基本上是一个Menu 小部件。要访问 OptionMenu 的菜单,请使用 self.om['menu']add_command 方法与普通菜单中的方法相同。 Menu 条目所做的是将与 OptionMenu 关联的变量更改为它们所代表的值。
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多