Updating OptionMenu from List

前端 未结 1 1768
清歌不尽
清歌不尽 2020-11-27 07:38

I have an OptionMenu in my GUI that is being populated by a list. Every time the user runs a certain process the list updates to reflect this. Is there a way to update the O

相关标签:
1条回答
  • 2020-11-27 08:22

    The options in an OptionMenu are not bound to the list from which they are created. Therefore, changing the list does not change the OptionMenu, you'll have to update it yourself.

    You can do that by getting the OptionMenu's menu, and add commands to that. The following example shows how to do this (based on this answer).

    It shows that, even though the self.options list is appended with an option using the 'Add option to list' button, the OptionMenu does not change automatically. To update the OptionMenu, you can use the 'Update option menu' button for this, which calls self.update_option_menu. This function deletes all options from the OptionMenu, and inserts a new one for each item in 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()
    
    0 讨论(0)
提交回复
热议问题