这只是代码的一小部分,我是python的新手,但是我正在制作一个计算器,并尝试使用for循环制作数字按钮。我所有的按钮都放置在正确的位置,上面有正确的数字,但是当我单击其中任何一个按钮时,它们都输出数字9。
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,所以如何使按钮输出正确的数字?
答案 0 :(得分:0)
通过将事件绑定到lambda函数,仅当按下按钮时调用该函数时,才会评估lambda函数中使用的所有变量,在这种情况下,number
在之后变为9
此设置循环,因此当按下任何按钮时,number
被评估为9
。
相反,您应该通过将lambda函数包装在另一个lambda函数中来对number
进行本地化,该函数会返回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))