ste*_*fff 2 python tkinter python-2.7
我想制作一些按钮,其中包含我从数据库返回的项目列表,它们都调用传递给列表项的函数.像这样的代码,但有效.此代码的问题是所有按钮都调用该函数'item3'.
#!/usr/bin/env python
from Tkinter import *
root = Tk()
def func(name):
print name
mylist = ['item1','item2','item3']
for item in mylist:
button = Button(root,text=item,command=lambda:func(item))
button.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
这里有两件事:
您需要将以下行缩进一级:
button.pack()
Run Code Online (Sandbox Code Playgroud)
目前,您只pack在最后一个按钮上调用该方法.进行此更改将导致为每个按钮调用它.
所有按钮都发送'item3'到,func因为这是当前的值item.重要的是要记住,lambda函数包含的表达式是在运行时计算的,而不是在编译时计算的.
但是,记住函数的参数以及它们的默认值(如果有的话)在编译时而不是运行时进行评估也很重要.
这意味着您可以通过为lambda提供一个默认值设置为的参数来解决问题item.这样做将"捕获" itemfor循环的每次迭代的值.
以下是解决这些问题的脚本版本:
from Tkinter import *
root = Tk()
def func(name):
print name
mylist = ['item1', 'item2', 'item3']
for item in mylist:
button = Button(root, text=item, command=lambda x=item: func(x))
button.pack()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)