如何让每个按钮输出自己的数字

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