2014-03-13 5 views
2

Tkinter에서 여러 Entry 위젯에 함수를 바인딩하려고 시도하고 있습니다. for 루프에서 많은 엔트리 위젯으로 프레임을 채웠다.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 객체가 해당 변수로 전달됩니다. 인수 목록 앞에 추가 인수를 추가하여 이벤트를 보유해야합니다 (예 : lambda event, strVar=strVar, i=i: self.obtain(i, strVar)).

+0

아, 아주 잘 작동합니다! Event 객체를 이해하지 못합니다. Checkbutton 위젯에서이 작업을 수행해야하는 이유는 무엇입니까? – KidSudi

+0

@KidSudi : 예제에 체크 버튼 위젯이 표시되지 않습니다. – BrenBarn

+0

즉, Checkbuttons와 비슷한 일을했는데 = lambda strVar = strVar, i = i 등의 명령을 만들었습니다.이 경우에는 Event 객체가 필요하지 않습니다. – KidSudi