将lambda函数绑定到通过for循环创建的多个Tkinter Entry小部件

2 投票
1 回答
1976 浏览
提问于 2025-04-17 22:11

我正在尝试把一个函数绑定到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)

撰写回答