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