Python 在Tkinter can上';t在循环中创建具有不同参数的多个按钮

Python 在Tkinter can上';t在循环中创建具有不同参数的多个按钮,python,button,tkinter,lambda,arguments,Python,Button,Tkinter,Lambda,Arguments,我试图用for循环在屏幕上创建许多按钮。我使用lambda调用带有参数的函数。但是我不能给每个按钮提供不同的参数。所以我需要知道为什么会发生这种情况。解决这个问题的办法是什么。tkinter是否对这些按钮使用相同的RAM缓存?若真是这样,我试图用另一个列表给这些按钮赋予不同的名称,但问题是相同的。谢谢你的回答 from tkinter import * def printmyvalue(value): print(value) app = Tk() test_list = [] for

我试图用for循环在屏幕上创建许多按钮。我使用lambda调用带有参数的函数。但是我不能给每个按钮提供不同的参数。所以我需要知道为什么会发生这种情况。解决这个问题的办法是什么。tkinter是否对这些按钮使用相同的RAM缓存?若真是这样,我试图用另一个列表给这些按钮赋予不同的名称,但问题是相同的。谢谢你的回答

from tkinter import *
def printmyvalue(value):
    print(value)
app = Tk()
test_list = []
for i in range(10):
    test_list.append(Button(app,text=str(i+1),command=lambda : printmyvalue(i)))
    test_list[i].grid(row=i)
app.mainloop()

这个问题出现了很多次,所以你可以找到它

command=lambda args=i:printmyvalue(args)
在您的版本中,
lambda:printmyvalue(i)
不会将值从
i
复制到函数
lambda
,但它会保留对变量
i
使用的内存的引用。因此,所有按钮对同一内存都有相同的引用。当你们点击按钮时,它会从这个内存中获取值,但在这个内存中是循环中使用的最后一个值——所以所有的按钮都使用最后一个值


使用
lambda args=i:
在每个
lamba
中创建新变量
args
,并将值从
i
复制到
args-因此每个
lambda`使用不同值的不同变量。

命令=lambda args=i:printmyvalue(args)