我试图在tkinter的for循环内创建按钮。在每个循环中,将i count值作为命令值中的一个参数传递出去。因此,当从命令值调用该函数时,我可以知道按下了哪个按钮并相应地进行操作。问题是,假设len是3,它将创建3个标题为“Game 1”到“Game 3”的按钮,但当任何一个按钮被按下时,打印的值总是2,即最后一次迭代。因此,看起来按钮是作为单独的实体创建的,但是命令参数中的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值与那个特定的按钮保持一致? 问题来源StackOverflow 地址:/questions/59383753/python-tkinter-button-widget-behavior
改变你的lambda为i=i: self.open_this(i)。 这可能看起来很神奇,但实际情况是这样的。当您使用那个lambda来定义函数时,open_this调用在您定义函数时不会得到变量i的值。相反,它做了一个闭包,这有点像一个对自己的注释,说“我应该查找变量I在被调用时的值”。当然,函数是在循环结束后调用的,所以在那个时候i总是等于循环的最后一个值。 使用i=i技巧将使函数在定义lambda时存储i的当前值,而不是等待以后查找i的值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。