我正在尝试在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
答案 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()