我如何让每个按钮输出自己的号码

时间:2018-07-16 03:32:34

标签: python for-loop numbers range calculator

这只是代码的一小部分,我是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,所以如何使按钮输出正确的数字?

1 个答案:

答案 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))