如何重复使用GUI的math.sqrt函数?

时间:2018-11-07 17:22:29

标签: python python-2.7 tkinter

我正在尝试在py 2.7计算器中添加math.sqrt函数。这是我正在使用的功能:

from Tkinter import *
from math import *

class calculator:
    def __init__(self, master):
        master.title("Simple Calculator")
        self.display = Entry(master)
        self.display.grid(columnspan = 8, ipadx = 60, ipady = 10)
        Button(master, text = "sqrt", fg = 'white', bg = 'black', 
               command = lambda:self.sqroot(), height =1, width = 10).grid(row = 6, column = 1)

def sqroot(self):
    try:
        self.s=self.display.get()
        self.sqroot=sqrt(eval(self.s))
        self.display.delete(0,END)
        self.display.insert(0,self.sqroot)
    except:
        self.display.delete(0,END)
        self.display.insert(0,'Invalid operation')

在生成的GUI中,我只能正确使用一次“ sqrt”按钮。我第二次收到以下错误消息:

TypeError: 'float' object is not callable

2 个答案:

答案 0 :(得分:3)

calculator.sqroot最初是一个函数(所需的函数)。

然后,对于您使用的计算器实例,将函数引用self.sqroot更改为浮点引用self.sqroot=sqrt(eval(self.s))。当您尝试像函数一样调用该float引用时,python会获取异常-y。

所以不要掩盖您已经使用过的名称,这样会没事的。

答案 1 :(得分:0)

您可以像这样使它工作。问题是因为self.sqroot = sqrt(eval(self.s))self.sqroot更改为字符串。为避免该问题,下面的代码仅将其存储在名为result的临时变量中。另外请注意,您也可以使用self.s做类似的事情,因为它的值只是在方法内部临时需要。

注意,我还修改了您的代码,使其更符合PEP 8 - Style Guide for Python Code准则。

from Tkinter import *
from math import *

class calculator:
    def __init__(self, master):
        master.title("Simple Calculator")
        self.display = Entry(master)
        self.display.grid(columnspan=8, ipadx=60, ipady=10)
        Button(master, text="sqrt", fg='white', bg='black',
               command=lambda: self.sqroot(), height=1, width=10).grid(row=6, column=1)

    def sqroot(self):
        try:
            self.s = self.display.get()
#            self.sqroot = sqrt(eval(self.s))
            result = sqrt(eval(self.s))
            self.display.delete(0, END)
#            self.display.insert(0, self.sqroot)
            self.display.insert(0, result)
        except:
            self.display.delete(0, END)
            self.display.insert(0, 'Invalid operation')

root = Tk()
calculator(root)
root.mainloop()