如何根据下拉菜单的选择动态填充tkinter中的选项小部件?

2 投票
2 回答
15373 浏览
提问于 2025-04-17 02:08

我的问题是这样的:我有几个文件,并且我做了一个下拉菜单,里面是这些文件的名字。接下来,我需要一个选项菜单,当选择一个文件名时,这个选项菜单可以改变,以显示该文件的一些数据。为了更清楚,我的问题只是关于如何在从下拉菜单中选择一个选项时,让选项菜单发生变化。谢谢大家的帮助。

2 个回答

-1

因为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给出的答案真的很有用。

10

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

撰写回答