在 Tkinter 中,在循环中创建按钮非常简单。但是,将特定参数传递给每个按钮的命令可能会变得很棘手。
考虑以下场景,其中您尝试创建标题为“游戏 1”到“游戏 3”的三个按钮。您打算将相应的数值传递给命令参数,以便在按下按钮时,您可以识别哪个按钮触发了该操作。
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)
不幸的是,此代码无法按预期工作。当按下任何按钮时,打印值始终为 2,即循环的最后一次迭代。出现问题的原因是 lambda 函数在循环结束时使用 i 的值,而不是创建每个按钮时的值。
要解决此问题,您需要需要围绕每个按钮的命令创建一个闭包。这可以通过使用语法 lambda i=i: self.open_this(i).
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda i=i: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W)
通过此修改来实现,每个按钮的命令在创建时捕获 i 的特定值。当按下按钮时,闭包确保将正确的 i 值传递给 open_this 函数。
以上是如何将循环变量正确传递给 Tkinter 按钮命令?的详细内容。更多信息请关注PHP中文网其他相关文章!