将lambda函数绑定到通过for循环创建的多个Tkinter Entry小部件
我正在尝试把一个函数绑定到Tkinter中的多个输入框(Entry widgets)。我用一个循环在我的框架里放了很多输入框。为了把一个函数绑定到通过循环创建的输入框,我想我可以这样做:
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()变量来理解……有什么想法吗?
1 个回答
3
事件会作为第一个参数传递给你的回调函数。因为你的回调函数的第一个参数是 strVar
,所以事件对象会被放在这个变量里。你应该在参数列表的最前面再加一个参数来接收这个事件,比如可以写成 lambda event, strVar=strVar, i=i: self.obtain(i, strVar)
。