Python,在lambda函数中以正确的方式赋值

时间:2017-03-05 20:41:44

标签: python lambda tkinter

我正在尝试制作一个按钮,用于打印我向他们提供的值。 在我看来,所有按钮都应在其文本值上打印相同的值。相反,他们都打印" 4"。解决这个问题的正确方法是什么?

from tkinter import *

root = Tk()

def printFunc(text):
    print(text)

list=[0,1,2,3,4]

for i in list:

    w = Button(root, text=list[i],command=lambda: printFunc(list[i])).pack()

root.mainloop()

2 个答案:

答案 0 :(得分:1)

解决方案是提供一个默认值,然后构建lambda

from Tkinter import *


root = Tk()

def printFunc(text):
    print(text)

lst=[0,1,2,3,4]

for i in lst:

    w = Button(root, text=lst[i],command=lambda x=lst[i]: printFunc(x)).pack()

root.mainloop()

答案 1 :(得分:1)

这是一个非常常见的初学者问题,因为您不了解lambda的工作原理。解决方案是使用functools.partial而不是lambda。

from tkinter import *
from functools import partial

root = Tk()

def printFunc(text):
    print(text)

list=[0,1,2,3,4]

for i in list:
    w = Button(root, text=list[i],command=partial(printFunc, list[i]))
    w.pack()

root.mainloop()

此外,始终将pack()放在新行上,这样可以避免另一个非常常见的初学者问题。