Python tkinter在循环中传递命令参数中创buildbutton

我正在尝试在for循环中创buildtkinter中的button。 并且每个循环都将i计数值作为parameter passing给命令值。 所以当从命令值调用函数时,我可以知道哪个button被按下,并相应地执行。 问题是,假设len是3,它将通过“游戏3”创build3个带有标题“游戏1”的button,但是当任何button被按下时,打印值总是2,即最后一次迭代。 所以看起来button被做成独立的实体,但是在命令参数中的i值似乎都是一样的。 这里是代码:

def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1),command=lambda:self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum) 

有没有一种方法来获得当前的i值,每次迭代,坚持与特定的button? 先谢谢你。

改变你的lambda到lambda i=i: self.open_this(i)

这可能看起来很神奇,但是这里发生了什么。 当您使用该lambda定义您的函数时,open_this调用在定义该函数时不会获取variablesi的值。 相反,它会形成一个闭包,这就像是对自己说的一句话:“我应该找出variablesi 在被调用时的价值 ”。 当然,这个函数在循环结束后被调用,所以在那个时候,我将永远等于循环的最后一个值。

使用i=i技巧会导致你的函数在你的lambda被定义的时候存储我的当前值,而不是等到稍后查找我的值。

这是closures如何在python中工作。 我曾经遇到过这个问题。 你可以使用functools.partial

 for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=partial(self.open_this, i)))