【问题标题】:How to display numbers in calculator, using TKinter in Python?如何在 Python 中使用 TKinter 在计算器中显示数字?
【发布时间】:2012-10-12 09:25:31
【问题描述】:

这是我的代码:

from Tkinter import*

calculator = Tk()
calculator.title('Calcualtor')
calculator.geometry('300x325')

screen = Frame(calculator, bd=2, width=250, height=25, relief=SUNKEN)
buttons = Frame(calculator, bd=2, width=250, height=200)
screen.grid(column=0, row=0, padx=25, pady=25)
buttons.grid(column=0, row=1, padx=25)

def appear():
    results.insert(0, "0")
    return

numbers=["7", "4", "1", "8", "5", "2", "9", "6", "3"]
for index in range(9):
   Button(buttons, bg="White", text=numbers[index], width=5, height=2, command=appear).grid(padx=5, pady=5, row=index%3, column=index/3) 

zero= Button(buttons, bg="White", text="0", width=5, height=2)
zero.grid(padx=5, pady=5, column=1, row=3)

functions=["-", "+", "*", "/"]
for index in range(4):
    Button(buttons, bg="White", text=functions[index], width=5, height=2).grid(padx=5, pady=5, row=index%4, column=3) 

equals= Button(buttons, bg="White", text="=", width=5, height=2)
equals.grid(ipadx=10, pady=5, row=5, column=1)

numbers = StringVar()
results = Entry(screen, textvariable=numbers, width=30)
results.pack()

calculator.mainloop()

计算器看起来不错,但我需要帮助让它在按下按钮时显示一个数字。正如您在我的函数中看到的那样,现在每次按下按钮时它都会显示“0”,而不是相应的数字。请帮忙。我还没有开始弄清楚如何让它做实际的数学运算,但如果你也能帮忙,那就太好了!

【问题讨论】:

    标签: python math tkinter calculator


    【解决方案1】:

    您需要创建一个闭包来返回按钮的相关编号。将您的 appear 函数更改为:

    def appear(x):
        #return an anonymous function which appends x to the "result" textentry
        return lambda: results.insert(END, x)
    

    然后像这样更改按钮的定义:

    numbers = ["7", "4", "1", "8", "5", "2", "9", "6", "3"]
    for index in range(9):
        n = numbers[index]
        Button(buttons, text=n, command=appear(n), ...).grid(...)
    

    这样每个按钮都有自己的函数,它会附加正确的数字。

    在 Python 中,函数只是另一个对象。 Button 类的 command 参数将函数(或任何其他可调用的东西,如类)作为参数,当按下按钮时调用该参数。 lambda 关键字创建了一个我们传递给类的匿名函数。上面定义的出现方法与此类似:

    def appear(x):
        #create a new function that displays x in the text entry and return it
        def show_x():
            results.insert(END, x)
        return show_x
    

    在这种情况下,我们不能内联 lambda:

    #THIS DOESN'T WORK AS EXPECTED:
    for index in range(9):
        n = numbers[index]
        f = lambda: results.insert(END, n)
        Button(..., command = f, ...)
    

    这是行不通的,因为n 是一个局部变量,它随着循环的每次迭代而变化,并且在函数f 的执行过程中被查找——这意味着在这种情况下它将始终保持最后一个值。我们需要为该值创建一个closure,我们在appear 函数中执行此操作。

    【讨论】:

    • 嘿,不错。我想我只是要删除我的答案,因为当我修复它时,它看起来非常与您的相似。
    • @DianaMC,“附加”是一个错字。前面的插入是由于0 作为插入的第一个参数,我从您的出现函数中复制了它而没有考虑它...将其更改为 Tkinter 常量 END 以附加到条目的末尾。
    • @l4mpi 所以我的老师希望我能够解释为什么 lambda 有效。你觉得可以给我一个简单的解释吗?
    • @DianaMC,如果您仍然感兴趣,我添加了一个解释。
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 2020-01-18
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多