首页 >后端开发 >Python教程 >如何将循环变量正确传递给 Tkinter 按钮命令?

如何将循环变量正确传递给 Tkinter 按钮命令?

Linda Hamilton
Linda Hamilton原创
2024-12-24 17:56:10174浏览

How Can I Pass Loop Variables Correctly to Tkinter Button Commands?

将循环变量传递给 Tkinter 按钮命令

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn