Python 使用不同的命令但外部变量创建多个Tkinter按钮

Python 使用不同的命令但外部变量创建多个Tkinter按钮,python,python-2.7,loops,button,tkinter,Python,Python 2.7,Loops,Button,Tkinter,我想在Tkinter中,在for循环中创建多个按钮。问题是我在一个数据帧中迭代,行中的值是我用.iterrows创建的Tkinter gadets的内容,这意味着我没有I,只有行和索引 问题是,当我创建按钮并使用lambda给它们不同的命令时,I:I=SomeFunctionsomevariable,这里我必须使用I以外的变量。结果是,所有命令都在末尾引用此somevariable的最后一个值,而不是创建按钮时引用的值 import tkinter def printout(somevaria

我想在Tkinter中,在for循环中创建多个按钮。问题是我在一个数据帧中迭代,行中的值是我用.iterrows创建的Tkinter gadets的内容,这意味着我没有I,只有行和索引

问题是,当我创建按钮并使用lambda给它们不同的命令时,I:I=SomeFunctionsomevariable,这里我必须使用I以外的变量。结果是,所有命令都在末尾引用此somevariable的最后一个值,而不是创建按钮时引用的值

import tkinter

def printout(somevariable):
    print(somevariable)

window = tkinter.Tk()

i = 0
somevariable = 0
for index, rows in enumerate(["a","b","c","d"]):
    b = tkinter.Button(window,  
                       text=rows, 
                       command= lambda i=i: printout(somevariable))
    b.pack()
    somevariable = somevariable + 1

window.mainloop()
所有按钮都包含somevariable的最后一个值作为命令


你知道怎么做吗?

免责声明:这个答案和Nae的答案一样古老,因为我试图解决这个问题,但直到Nae发布了副本后才解决。要进一步解释发生的情况:

问题是,按下按钮时会计算lambda。 此时它将打印某个变量的值。您可以通过在创建lambda时为lambda提供somevariable的快照来修复somevariable的当前值,方法是使用-为了更清楚地说明这一点,我将其重新表述为:

command= lambda s=somevariable: printout(s)) 
为了明确lambda使用s,它在此时和调用时获取somevariable的值,将打印s

完整示例:

import tkinter 

def printout(somevariable):
    print(somevariable)

window = tkinter.Tk()    

somevariable = 0
for index, rows in enumerate(["a","b","c","d"]): 
    b = tkinter.Button(window,  
                       text=rows, 
                       command= lambda s=somevariable: printout(s)) 
    b.pack()
    somevariable = somevariable + 1

window.mainloop()
替换:

command= lambda i=i: printout(somevariable))
与:


缩进怎么样?缩进很重要,你的已经关闭了。非常感谢,它正在工作。这让我省去了几个小时的努力,实际上也省去了一个更大的项目丢失的钥匙。再次感谢。@Mark Nae解决了/找到了受骗者。我只是挖苦并解释了如果你那样做为什么它会起作用。
command= lambda somevariable=somevariable: printout(somevariable))