我试图从列表形式存储的一组数据动态构建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()
Run Code Online (Sandbox Code Playgroud)
设置默认值i:
command=lambda i=i: self.buttoncall(i)
Run Code Online (Sandbox Code Playgroud)
在没有参数的情况下调用回调时,默认值i将绑定到局部变量i.由于默认值在定义lambda时是固定的,因此值i将是所需的值.
如果没有默认值i,则调用回调时i不是局部变量.Python改为查找i封闭范围中的值.但是,当调用回调时,for-loop已完成且i等于len(mylist)-1.所以所有的回调都使用相同的值i.
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |