创建python GUI计算器,但平方根函数给我带来了问题

2024-09-29 23:33:27 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在运行程序时立即使用平方根函数时,它工作得很好。问题是,例如,如果我加8+8,那么在输出(16)上使用平方根函数。然后我得到了错误

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\bigfe\Anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
        return self.func(*args)
      File "C:/Users/bigfe/.spyder-py3/APython/net/Calc.py", line 124, in squareroot
        textbox.insert(0, math.sqrt(f_num))
    AttributeError: 'str' object has no attribute 'sqrt' 

我尝试了一切,甚至确认加法函数的输出是一个浮点,但它仍然给我错误

这是我的密码


    textbox = Entry(calc, font = ('arial',20, 'bold'), bd = 30, width = 27, bg = 'gray', justify=RIGHT)
    textbox.grid(row = 0, column = 0, columnspan = 4, pady=1 )
    #This is what is shown in the entry box
    textbox.insert(0, 0)

    def numEnter(num):
        if(textbox.get() == '0'): 
            textbox.delete(0, END)
        current = textbox.get()
        textbox.delete(0, END)
        ak = textbox.insert(0, str(current) + str(num))


    def clear():
        textbox.delete(0, END)
        textbox.insert(0, 0)

    def allClear():
        textbox.delete(0, END)
        textbox.insert(0, 0)
        current = 0

    def add():
        firstnum = textbox.get()
        global f_num
        global math
        f_num = float(firstnum)
        math = 'addition'
        textbox.delete(0, END)

    def subtract():
        firstnum = textbox.get()
        global f_num
        global math
        f_num = float(firstnum)
        math = 'subtraction'
        textbox.delete(0, END)

    def multiply():
        firstnum = textbox.get()
        global f_num
        global math
        f_num = float(firstnum)
        math = 'multiplication'
        textbox.delete(0, END)

    def divide():
        firstnum = textbox.get()
        global f_num
        global math
        f_num = float(firstnum)
        math = 'division'
        textbox.delete(0, END)

    def squareroot():
        firstnum = textbox.get()
        global f_num
        global math

        f_num = float(firstnum)
        textbox.delete(0, END)
        textbox.insert(0, math.sqrt(f_num))

    def pi():
        if(textbox.get() == 0): 
            textbox.delete(0, END)
        textbox.insert(0, float(math.pi))
        global frst
        frst = textbox.get()



    def equal():
        if (math == 'addition'):
            second_num = textbox.get()
            textbox.delete(0, END)
            global ans
            ans = (f_num + float(second_num))
            print(type(ans))
            textbox.insert(0, ans)

        elif (math == 'subtraction'):
            second_num = textbox.get()
            textbox.delete(0, END)
            textbox.insert(0, f_num - float(second_num))

        elif (math == 'multiplication'):
            second_num = textbox.get()
            textbox.delete(0, END)
            textbox.insert(0, f_num * float(second_num))

        elif (math == 'division'):
            second_num = textbox.get()
            textbox.delete(0, END)
            textbox.insert(0, f_num / float(second_num))

我省略了构造计算器的代码,因为我认为这是不必要的。如果你想看到任何其他部分的代码,请让我知道


Tags: 函数ingetdefmathfloatdeleteglobal
2条回答

只需将您正在使用的“math”变量的名称更改为任何其他您认为与您正在导入的数学函数重叠的变量

在Python中,名称一次只能命名一件事。特别是,您的全局变量(名称)一次只能命名一件事

因为您的代码是math.sqrt,您希望得到一个平方根函数,所以我假设您在所示代码上方的某个地方import math。导入模块时,这是一个赋值——在Python加载模块后,它创建一个模块对象,并且math成为该模块的名称

在这方面没有对模块的特殊处理-名称math只是一个名称,随后可以用来命名其他任何东西-但一次只能命名一件事

所以以后,当你做类似的事情时

    global math
    math = 'addition'

这使得math停止作为标准库模块的名称,而开始作为该字符串的名称

字符串没有sqrt方法。方法是一种属性——通常,x.y表示名为x的对象(事物)的名为y的属性。如果由于某些内容没有具有指定名称的属性而导致错误,则会得到一个AttributeError

使用不同的名称跟踪您正在执行的操作

相关问题 更多 >

    热门问题