Python 如何在GUI中重复使用math.sqrt函数?
我正在尝试在py 2.7计算器中添加math.sqrt函数。以下是我正在使用的函数:Python 如何在GUI中重复使用math.sqrt函数?,python,python-2.7,tkinter,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
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”对象不可调用
计算器。sqroot最初是一个函数(您想要的函数)
然后,对于正在使用的计算器实例,将函数引用self.sqroot
更改为浮点引用self.sqroot=sqrt(eval(self.s))
。当您试图像调用函数一样调用该float引用时,python会得到exception-y
因此,不要屏蔽您已经使用过的名称,这样您就不会有问题了。code>calculator.sqroot最初是一个函数(您想要的函数) 然后,对于正在使用的计算器实例,将函数引用
self.sqroot
更改为浮点引用self.sqroot=sqrt(eval(self.s))
。当您试图像调用函数一样调用该float引用时,python会得到exception-y
所以,不要掩盖你已经使用过的名字,你会没事的。你可以让它像这样工作。问题是因为
self.sqroot=sqrt(eval(self.s))
将self.sqroot
更改为字符串。为了避免问题,下面的代码只将其存储在名为result
的临时变量中。还请注意,您也可以对self.s
执行类似的操作,因为它的值仅在方法内部临时需要
注意我还修改了您的代码,使其更符合指导原则
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()
你可以让它像这样工作。问题是因为
self.sqroot=sqrt(eval(self.s))
将self.sqroot
更改为字符串。为了避免问题,下面的代码只将其存储在名为result
的临时变量中。还请注意,您也可以对self.s
执行类似的操作,因为它的值仅在方法内部临时需要
注意我还修改了您的代码,使其更符合指导原则
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()
你能指出抛出错误的那条线吗?或者最好在堆栈跟踪后使用
eval
,如果self.s
只是一个浮点数。请使用float
。。。并且,如果不使用lambda,这将更容易调试。创建适当的函数,以便可以使用调试器或添加打印语句来检查计算所使用的值。是否可以指向引发错误的行?或者最好在堆栈跟踪后使用eval
,如果self.s
只是一个浮点数。请使用float
。。。并且,如果不使用lambda,这将更容易调试。创建适当的函数,以便可以使用调试器或添加打印语句来检查计算使用的值。OP还应避免eval
(安全原因)OP还应避免eval
(安全原因)