OptionMenu中的選項未綁定到創建它們的列表。因此,更改列表不會改變OptionMenu,您必須自己更新。
您可以通過獲取OptionMenu的menu
,並添加命令來做到這一點。以下示例顯示如何執行此操作(基於this answer)。
它表明即使self.options
列表附加了使用「添加選項到列表」按鈕的選項,OptionMenu不會自動更改。要更新OptionMenu,您可以使用'更新選項菜單'按鈕來調用此選項,該選項調用self.update_option_menu
。該功能從OptionMenu中刪除所有選項,並在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()
這是完美的,謝謝!我真的不明白*爲什麼*它的工作原理(我嘗試以不同的方式實施並失敗),但它仍然有效,對我來說這已經足夠了。 – wes3449 2015-02-09 15:50:00
你究竟知道什麼?我可以嘗試解釋一些。 – fhdrsdg 2015-02-09 15:55:34
大部分只是我們添加命令而不是字符串的事實。 (雖然我猜想,因爲我們做了'command = lambda',它變成了一個什麼都不做的命令)。我指的是'update_option_menu'函數,其他的都是有意義的。 – wes3449 2015-02-09 16:04:50