【问题标题】:How can I dynamic populate an option widget in tkinter depending on a choice from a drop down menu?如何根据下拉菜单中的选择动态填充 tkinter 中的选项小部件?
【发布时间】:2011-09-12 20:13:49
【问题描述】:

我的问题如下:我有几个文件,并且我已经制作了一个带有名称的下拉菜单,接下来我需要一个选项菜单,只要选择文件名以显示来自特定文件作为选项。明确地说,我的问题只是关于如何在选择下拉选项时更改选项菜单。感谢您的帮助。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    OptionMenu 小部件只不过是一个便利类,它创建与菜单关联的菜单按钮。您可以通过"menu" 属性访问此菜单。唯一的技巧是知道菜单项应该做什么,这无非是设置相关变量的值。

    这是一个例子:

    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()
    

    【讨论】:

    • 非常好的解释,非常有用。谢谢。
    • 那么,您是说为了将菜单项动态添加到已经实例化的菜单中,您必须先删除菜单项,然后才能创建新的菜单项?
    • @user2962794:不,这不是我要说的。不需要删除那里的项目。它的核心只是一个菜单,您可以完全访问所有菜单方法。您可以插入新项目,也可以删除或修改现有项目。
    • 对不起。我想到了。我的代码中有一些错误或某些东西阻止了动态菜单项的出现(所以我发现了这个问题,并要求澄清)。它可以像我最初希望的那样工作(我的意思是,您不必在菜单创建中添加菜单项)。但是,很高兴听到澄清! :)
    【解决方案2】:

    由于 OptionMenu 提供了一个命令选项,我建议保留对已经给出的命令(如果有的话)的引用,并以这种方式将其传递给新选项:

    注意,变量基于上一个答案

    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))                         
            ...
    

    希望它有任何用处 顺便说一句,Bryan Oakley 给出的答案真的很有用,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 2012-10-25
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多