如何传递self.selected(i)? - Python

5 浏览
0 Comments

如何传递self.selected(i)? - Python

当我运行这段代码时,我得到了一个10x10的正方形网格,正是我想要的,但问题是command=self.selected(i)似乎让所有的按钮都执行self.selected(100),而不是1、2、3、4... 100。我在这里做错了什么吗?\n我想使用一个\"list\"或\"array\"来实现这个,因为这比写100个按钮要容易得多。

0
0 Comments

从上面的内容中可以看出,问题的原因是在创建按钮的时候,使用了闭包的方式来传递参数。在闭包中,命令(command)被设置为self.selected(i),然而,当命令执行时,它捕获了的值,而不是按钮被创建时的值。因此,每次执行命令时,的值都是100,而不是预期的按钮索引。

为了解决这个问题,可以在创建按钮时将赋值给另一个局部变量,然后在闭包中使用这个局部变量。这样,当命令执行时,它捕获的是按钮被创建时的索引值,而不是100。

下面是解决方法的代码示例:

command=lambda i=i: self.selected(i)

通过将赋值给i的新的局部变量,我们确保闭包中捕获的是按钮被创建时的索引值,而不是100。这样,self.selected(i)将会使用正确的索引值。

这样,我们就解决了问题,并确保了闭包中使用正确的索引值来调用self.selected函数。

0
0 Comments

问题的原因是在当前代码中,lambda函数中的self.selected(i)闭包了变量i,所以在每个命令中,它的值都等于在函数外部设置的值。通过在lambda函数中添加i=i,创建了一个局部作用域的变量i,它在循环迭代继续进行时不会改变。

解决方法是将代码修改为:

self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda i=i: self.selected(i))

非常感谢!它完美地解决了问题! 😀

0