如何让每个按钮输出自己的数字
How do I get each button to output their own number
这只是代码的一小部分,我是 python 的新手,但我正在制作一个计算器并尝试使用 for 循环制作数字按钮。我所有的按钮都放在正确的位置,上面有正确的数字,但是当我点击其中任何一个时,它们都会输出数字九。
for number in range(1, 10):
row= math.ceil(number/3) + 5
col = (number-1) % 3
num_btn = Button(self.root, text=str(number), height=3, width=9, bg='white', relief='solid', borderwidth=1)
num_btn.grid(row=row, column=col, padx=1, pady=1)
num_btn.bind('<Button-1>', lambda event: self.putDigit (event, number))
我觉得跟最后一行的(event, number))有关,好像改成(number-1)会输出8,那我怎么让按钮输出正确的数字?
通过将事件绑定到 lambda 函数,lambda 函数中使用的所有变量仅在按下按钮时调用函数时才被计算,在这种情况下 number
变为 9
在此设置循环之后,因此当按下任何按钮时 number
被评估为 9
.
相反,您应该通过将 lambda 函数包装在另一个 lambda 函数中来本地化 number
,returns 您的 lambda 函数使用您希望本地化的数字作为参数:
for number in range(1, 10):
row= math.ceil(number/3) + 5
col = (number-1) % 3
num_btn = Button(self.root, text=str(number), height=3, width=9, bg='white', relief='solid', borderwidth=1)
num_btn.grid(row=row, column=col, padx=1, pady=1)
num_btn.bind('<Button-1>', (lambda x: lambda event: self.putDigit (event, x))(number))
或者,正如 Ignacio Vazquez-Abrams 所指出的那样,您还可以将 number
设置为默认参数值,以便在定义 lambda 函数时对其进行计算:
num_btn.bind('<Button-1>', lambda event, x=number: self.putDigit (event, x))
这只是代码的一小部分,我是 python 的新手,但我正在制作一个计算器并尝试使用 for 循环制作数字按钮。我所有的按钮都放在正确的位置,上面有正确的数字,但是当我点击其中任何一个时,它们都会输出数字九。
for number in range(1, 10):
row= math.ceil(number/3) + 5
col = (number-1) % 3
num_btn = Button(self.root, text=str(number), height=3, width=9, bg='white', relief='solid', borderwidth=1)
num_btn.grid(row=row, column=col, padx=1, pady=1)
num_btn.bind('<Button-1>', lambda event: self.putDigit (event, number))
我觉得跟最后一行的(event, number))有关,好像改成(number-1)会输出8,那我怎么让按钮输出正确的数字?
通过将事件绑定到 lambda 函数,lambda 函数中使用的所有变量仅在按下按钮时调用函数时才被计算,在这种情况下 number
变为 9
在此设置循环之后,因此当按下任何按钮时 number
被评估为 9
.
相反,您应该通过将 lambda 函数包装在另一个 lambda 函数中来本地化 number
,returns 您的 lambda 函数使用您希望本地化的数字作为参数:
for number in range(1, 10):
row= math.ceil(number/3) + 5
col = (number-1) % 3
num_btn = Button(self.root, text=str(number), height=3, width=9, bg='white', relief='solid', borderwidth=1)
num_btn.grid(row=row, column=col, padx=1, pady=1)
num_btn.bind('<Button-1>', (lambda x: lambda event: self.putDigit (event, x))(number))
或者,正如 Ignacio Vazquez-Abrams 所指出的那样,您还可以将 number
设置为默认参数值,以便在定义 lambda 函数时对其进行计算:
num_btn.bind('<Button-1>', lambda event, x=number: self.putDigit (event, x))