我正在尝试通过以列表形式存储的一组数据在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 回答
皈依舞
TA贡献1851条经验 获得超3个赞
为以下项设置默认值i
:
command=lambda i=i: self.buttoncall(i)
当不带任何参数调用回调时,的默认值i
将绑定到本地变量i
。由于默认值在定义lambda时是固定的,因此的值i
将是所需的值。
如果没有默认值i
,则在调用回调时,i
它不是局部变量。取而代之的是i
,Python在封闭范围内找到的值。但是,到回调调用时,回调for-loop
已经完成,i
并且等于len(mylist)-1
。因此,所有回调都使用的相同值i
。
添加回答
举报
0/150
提交
取消