首页 >后端开发 >Python教程 >将命令绑定到 Tkinter 循环中创建的按钮时如何避免意外行为?

将命令绑定到 Tkinter 循环中创建的按钮时如何避免意外行为?

Linda Hamilton
Linda Hamilton原创
2024-12-20 00:51:11360浏览

How to Avoid Unexpected Behavior When Binding Commands to Buttons Created in a Tkinter Loop?

使用命令参数绑定创建 Tkinter 循环按钮

在 Tkinter 中,在 for 循环中创建按钮在尝试将每个按钮的命令与唯一参数绑定时可能会带来挑战。

考虑以下场景:

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)

执行时这段代码中,您可能会遇到一种奇怪的行为,即按下任何按钮总是打印相同的值,通常是最后一次迭代值。出现这种情况是因为循环中创建的每个 lambda 函数都引用相同的变量 i,该变量在每次循环迭代中都会更新。

解决方案:利用闭包

要解决此问题,您可以利用 Python 的闭包通过将 i 分配给 lambda 函数中的新变量,有效地为每个按钮创建唯一的范围。下面是修改后的代码:

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)

def open_this(self, myNum):
    print(myNum)

通过合并闭包,每个 lambda 函数在定义时捕获当前 i 值,确保正确的按钮行为。

以上是将命令绑定到 Tkinter 循环中创建的按钮时如何避免意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

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