在python中使用参数动态设置回调

时间:2013-05-26 18:19:55

标签: python

我正在尝试从列表表单中存储的一组数据中动态构建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()

1 个答案:

答案 0 :(得分:5)

设置i的默认值:

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

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

没有i的默认值,当调用回调时i不是局部变量。 Python改为在封闭范围内找到i的值。但是,在调用回调时,for-loop已完成且i等于len(mylist)-1。因此,所有回调都使用相同的i值。