Python 如何在GUI中重复使用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

我正在尝试在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”对象不可调用

计算器。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
(安全原因)