How can I dynamic populate an option widget in tkinter depending on a choice from a drop down menu?

前端 未结 2 1579
误落风尘
误落风尘 2020-12-09 07:11

my problem is the following: I have several files and I have made a drop down menu with the names,the next thing I need is an option menu which can be changed whenever a fil

相关标签:
2条回答
  • 2020-12-09 07:43

    As the OptionMenu gives a command option, i would suggest to keep reference to the command already given (if any) and pass it to the new options this way:

    attendion, variables based on the previous answer

    def __init__(self, *args, **kwargs):
        ...
        self.command=kwargs['command']
        ...
    
    def _reset_option_menu(options, index=None):
        ...
        menu.add_command(label=string, 
                         command=lambda:self.command(),
                         value=self.om_variable.set(string))                         
            ...
    

    Hope its of any use Btw, really usefull the answer given by Bryan Oakley,

    0 讨论(0)
  • 2020-12-09 07:52

    The OptionMenu widget is nothing more than a convenience class that creates a menubutton that is associated with a menu. You can get at this menu via the "menu" attribute. The only trick is to knowing what the menu items should do, which is nothing more than setting the value of the associated variable.

    Here's an example:

    import Tkinter as tk
    
    class SampleApp(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)
            self.om_variable = tk.StringVar(self)
    
            b1 = tk.Button(self, text="Colors", width=8, command=self.use_colors)
            b2 = tk.Button(self, text="Sizes", width=8, command=self.use_sizes)
    
            self.om = tk.OptionMenu(self, self.om_variable, ())
            self.om.configure(width=20)
            self.use_colors()
    
            b1.pack(side="left")
            b2.pack(side="left")
            self.om.pack(side="left", fill="x", expand=True)
    
    
        def _reset_option_menu(self, options, index=None):
            '''reset the values in the option menu
    
            if index is given, set the value of the menu to
            the option at the given index
            '''
            menu = self.om["menu"]
            menu.delete(0, "end")
            for string in options:
                menu.add_command(label=string, 
                                 command=lambda value=string:
                                      self.om_variable.set(value))
            if index is not None:
                self.om_variable.set(options[index])
    
        def use_colors(self):
            '''Switch the option menu to display colors'''
            self._reset_option_menu(["red","orange","green","blue"], 0)
    
        def use_sizes(self):
            '''Switch the option menu to display sizes'''
            self._reset_option_menu(["x-small", "small", "medium", "large"], 0)
    
    if __name__ == "__main__":
        app = SampleApp()
        app.mainloop()
    
    0 讨论(0)
提交回复
热议问题