1

我正在尝试根据以列表形式存储的一组数据在 tkinter 中动态构建一些按钮。我无法解决的是如何将参数放入回调函数中。由于回调中的代码直到回调时才执行,所以回调中使用的变量此时已更改值。

这是代码的(非常)简化版本:

from Tkinter import *
from ttk import *

mylist = ['a','b','c','d','e']


class App:

    def __init__(self, master):

        self.frame = Frame(master)
        self.frame.pack()

        for i in range (0,len(mylist)):
            setattr(self, 'button' + str(i), Button(self.frame, text=mylist[i], command= lambda: self.buttoncall(i)))
            getattr(self, 'button' + str(i)).pack(side=LEFT)

    def buttoncall(self,input):
        print mylist[input]

root = Tk()

app = App(root)

root.mainloop()
4

1 回答 1

6

为 设置默认值i

command=lambda i=i: self.buttoncall(i)

当不带参数调用回调时,默认值i将绑定到局部变量i。由于默认值在定义 lambda 时是固定的,因此 的值i将是所需的值。

如果没有 的默认值i,则调用回调时i不是局部变量。i相反,Python在封闭范围内查找值。然而,当回调被调用时,for-loop已经完成并且i等于len(mylist)-1。所以所有回调都使用相同的i.

于 2013-05-26T18:22:24.120 回答