问题描述
我创建了一个列表和一个向该列表添加新按钮的循环。唯一的问题是按钮似乎没有记住它们适当的命令,并且总是必须在循环中回调变量 x
。
Buttons = []
for x in range(9):
Buttons.append(Button(frame2,text = str(x+1),command = lambda : num_pressed(x+1),width = 10,height = 5))
函数 num_pressed
以与文本相同的方式使用变量 x
,除了文本在定义后保持不变,但命令没有。
因此,一旦创建了所有按钮,就会调用 x = 8
的命令,因为这是循环结束的地方。所以最后他们都调用了命令 num_pressed(9)
如何让命令像文本一样记住它应该记住的值?也许为每个按钮分配某种值,然后根据存储在按钮本身中的值分配命令?
旁注:我还没有找到方法,但应该可以使用 .cget('text')
方法,因为按钮的文本恰好与 {{ 中使用的变量具有相同的值1}}.
解决方法
这是一个常见问题,它有一个简单的解决方案:将您的 lambda 函数 x 作为参数!为此,请将 lambda : num_pressed(x + 1)
替换为 lambda x=x: num_pressed(x + 1)
(或 lambda x: num_pressed(x + 1)
,不确定,但现在无法测试,已经晚了……但尝试一下,两者之一会起作用) .