Python 从列表中更新选项菜单
我的GUI中有一个OptionMenu,它由一个列表填充。每次用户运行某个进程时,列表都会更新以反映这一点。有没有办法根据列表更新选项菜单?我已按照尝试了Python 从列表中更新选项菜单,python,python-3.x,tkinter,tkinter.optionmenu,Python,Python 3.x,Tkinter,Tkinter.optionmenu,我的GUI中有一个OptionMenu,它由一个列表填充。每次用户运行某个进程时,列表都会更新以反映这一点。有没有办法根据列表更新选项菜单?我已按照尝试了self.plotWindow.update(),但没有效果。但是,关闭并重新打开窗口确实会像您预期的那样刷新OptionMenu。相关代码: if self.figNum.get() == 'New Figure...': if self.figList[-1] == 'New Figure...': self.fig
self.plotWindow.update()
,但没有效果。但是,关闭并重新打开窗口确实会像您预期的那样刷新OptionMenu。相关代码:
if self.figNum.get() == 'New Figure...':
if self.figList[-1] == 'New Figure...':
self.figList.append(1)
else:
self.figList.append(self.figList[-1]+1)
self.plotWindow.update() #tk.Tk() window
self.i = self.figList[-1]
else:
self.i = self.figNum.get()
选项菜单中的选项不绑定到创建它们的列表。因此,更改列表不会更改选项菜单,您必须自己更新它 您可以通过获取OptionMenu的
菜单
,并向其中添加命令来完成此操作。以下示例显示了如何执行此操作(基于)
它显示,即使使用“将选项添加到列表”按钮将选项附加到self.options
列表,选项菜单也不会自动更改。要更新选项菜单,您可以为此使用“更新选项菜单”按钮,该按钮调用self.update\u option\u menu
。此函数从选项菜单中删除所有选项,并为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()
我认为更新OptionMenu的一个简单解决方案是使用类中内置的configure函数,如下所示:
my_option_menu.configure(window, user_choice, *updated_list)
这太完美了,谢谢!我真的不明白为什么它会起作用(我尝试以不同的方式实现它,但失败了),但它仍然有效,这对我来说已经足够好了。你到底不明白哪一部分?我可以再解释一下,主要是我们添加的是命令而不是字符串。(虽然我猜,因为我们使用了
command=lambda
,它就变成了一个什么都不做的命令)。我指的是update\u option\u菜单
功能,其他一切都有意义。OptionMenu基本上是一个小部件。要访问选项菜单的菜单,请使用self.om['Menu']
。添加命令的方法与普通菜单中的方法相同。菜单项所做的是将与OptionMenu关联的变量更改为它们所表示的值。