【发布时间】:2011-09-12 20:13:49
【问题描述】:
我的问题如下:我有几个文件,并且我已经制作了一个带有名称的下拉菜单,接下来我需要一个选项菜单,只要选择文件名以显示来自特定文件作为选项。明确地说,我的问题只是关于如何在选择下拉选项时更改选项菜单。感谢您的帮助。
【问题讨论】:
我的问题如下:我有几个文件,并且我已经制作了一个带有名称的下拉菜单,接下来我需要一个选项菜单,只要选择文件名以显示来自特定文件作为选项。明确地说,我的问题只是关于如何在选择下拉选项时更改选项菜单。感谢您的帮助。
【问题讨论】:
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()
【讨论】:
由于 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 给出的答案真的很有用,
【讨论】: