【问题标题】:Binding a lambda function to multiple Tkinter Entry widgets created with For loop将 lambda 函数绑定到使用 For 循环创建的多个 Tkinter Entry 小部件
【发布时间】:2014-04-18 18:15:27
【问题描述】:

我正在尝试将一个函数绑定到 Tkinter 中的多个 Entry 小部件。我在 for 循环中用许多 Entry 小部件填充了我的框架。要将函数绑定到使用 for 循环创建的 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() 变量...有什么想法吗?

【问题讨论】:

    标签: python tkinter widget tkinter-entry


    【解决方案1】:

    事件作为第一个参数传递给您的回调。由于您的回调的第一个参数是strVar,因此事件对象正在该变量中传递。您应该在参数列表的前面添加一个附加参数来保存事件,例如,lambda event, strVar=strVar, i=i: self.obtain(i, strVar)

    【讨论】:

    • 啊,很好用!我只是不明白 Event 对象。为什么我不必为 Checkbutton 小部件执行此操作?
    • @KidSudi:我在您的示例中没有看到任何检查按钮小部件。
    • 即我对 Checkbuttons 做了类似的事情,命令 = lambda strVar=strVar, i=i 等。在这种情况下不需要 Event 对象。
    • @KidSudi -- “不需要 Event 对象” -- 你怎么知道?也许有人会提出需求。而且,即使他们不这样做,围绕特殊情况进行编码也比将其与 API 的其余部分保持相同更困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多