2014-03-13 47 views
2

我試圖將一個函數綁定到Tkinter中的多個Entry小部件。我在For循環中用許多Entry小部件填充框架。綁定到使用一個for循環中創建條目小部件的功能,我想我可以做類似如下:將一個lambda函數綁定到用For循環創建的多個Tkinter Entry小部件

import Tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master): 
     self.master = master 
     tk.Frame.__init__(self, master, width=200, height=200) 
     self.master.title('Application') 
     self.pack_propagate(0) 
     self.pack() 

     for i in range(10): 
      strVar = tk.StringVar() 
      item = tk.Entry(self, textvariable=strVar) 
      item.bind(sequence='<Return>', func=lambda strVar=strVar, i=i: self.obtain(i, strVar)) 
      item.grid(row=i, sticky=tk.W) 

    def obtain(self, i, strVar): 
     print i 
     print strVar.get() 

    def run(self): 
     self.mainloop() 

app = Application(tk.Tk()) 
app.run() 

但我得到以下錯誤:

print strVar.get() 
AttributeError: Event instance has no attribute 'get' 

我不不明白爲什麼它不能將strVar解釋爲tk.StringVar()變量......任何想法?

回答

3

該事件作爲您的回調的第一個參數傳遞。由於您的回調的第一個參數是strVar,因此Event對象正在傳遞給該變量。您應該在參數列表的前面添加一個additionl參數來保存該事件,例如,lambda event, strVar=strVar, i=i: self.obtain(i, strVar)

+0

啊,非常好,它的工作原理!我只是不瞭解Event對象。爲什麼我不必爲Checkbutton小部件做這件事? – KidSudi

+0

@KidSudi:我的例子中沒有看到任何checkbutton小部件。 – BrenBarn

+0

即我用Checkbutton做了類似的事情,做了命令= lambda strVar = strVar,i = i等。在這種情況下,不需要Event對象。 – KidSudi