从列表更新OptionMenu

发布于 2021-01-29 19:35:56

我的GUI中有一个由菜单填充的OptionMenu。每次用户运行某个进程时,列表都会更新以反映这一点。有没有一种方法可以基于列表更新OptionMenu?我已经试过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()
关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

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

    您可以通过获取OptionMenu的来实现menu,并向其中添加命令。以下示例显示了如何执行此操作(基于此答案)。

    它显示,即使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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看