2015-02-09 36 views
1

我在我的GUI中有一個OptionMenu正在填充列表。每次用戶運行某個進程時,該列表都會更新以反映這一點。有沒有辦法根據列表更新OptionMenu?我試過self.plotWindow.update()根據this question,但無濟於事。但是,關閉並重新打開窗口會按照您的預期刷新OptionMenu。相關代碼:從列表更新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() 

回答

3

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

這是完美的,謝謝!我真的不明白*爲什麼*它的工作原理(我嘗試以不同的方式實施並失敗),但它仍然有效,對我來說這已經足夠了。 – wes3449 2015-02-09 15:50:00

+0

你究竟知道什麼?我可以嘗試解釋一些。 – fhdrsdg 2015-02-09 15:55:34

+0

大部分只是我們添加命令而不是字符串的事實。 (雖然我猜想,因爲我們做了'command = lambda',它變成了一個什麼都不做的命令)。我指的是'update_option_menu'函數,其他的都是有意義的。 – wes3449 2015-02-09 16:04:50