为什么我的计算器没有计算答案?

时间:2015-01-06 22:01:40

标签: python user-interface syntax-error calculator

def Functional_Output(Validate_Input):
    try:
        while '(' in Validate_Input and ')' in Validate_Input:
            Validate_Output = Validate_Input.count('(')

            Intake_Input = Validate_Input.find('(')
            fin = Validate_Input.find(')')+1

            while Validate_Output > 1:
                Intake_Input = Validate_Input.find('(', Intake_Input+1)
                Validate_Output -= 1

            receive_value = Validate_Input[Intake_Input:fin]
            receive_input = calcula(receive_value.replace('(', ''). replace(')', ''))
            Validate_Input = Validate_Input.replace(recieve_value, recieve_input)

        DisplayAnswer = float(AddFunction(Validate_Input))

    except:
        DisplayAnswer = "Error"
    return DisplayAnswer
def AddFunction(Validate_Input):
    add_selection = Validate_Input.split()

    while len(add_selection) != 1:

        for index in range(len(add_selection)):
            if add_selection[index] == '/':
                add_selection[index] = str(float(add_selection[index-1]) / float(add_selection[index+1]))
                add_selection.pop(index+1)
                add_selection.pop(index-1)
                break
            elif add_selection[index] == '*':
                add_selection[index] = str(float(add_selection[index-1]) * float(add_selection[index+1]))
                add_selection.pop(index+1)
                add_selection.pop(index-1)
                break
        if not '/' in add_selection and not '*' in add_selection:
            while len(add_selection) !=1:
                for index in range(len(add_selection)):
                    add_selection[index] = str(float(add_selection[index]) + float(add_selection[index+1]))

                    add_selection.pop(index+1)
                    break
    return add_selection[0]

root = tkinter.Tk()
root.resizable(0, 0)
root.title("Calculator")
txtDisplay =tkinter.StringVar()
operator = ""
App_Function = Calculator_App(root)

root.mainloop()

为什么当我点击按钮'9'然后'+'然后'1'时,该条目返回消息'错误'而不是'10'!为什么是这样? 它可能与addFunction函数和索引有关吗?

1 个答案:

答案 0 :(得分:0)

在您的代码中:

line 98, in Functional_Output DisplayAnswer = float(AddFunction(Validate_Input))

AddFunction返回一个字符串:'8 + 9'; 然后你试图将这个字符串转换为浮点数。 它产生了一个ValueError,cuz字符串不能转为浮点数。

要解决此问题,您需要找到AddFunction并使其返回8 + 9而不是'8 + 9',

我认为你的问题就在这一行:

add_selection[index] = str(float(add_selection[index]) + float(add_selection[index+1]))

您正在将add_selection [index]转换为float,然后转换为字符串。尝试删除外部str()

编辑:

进一步了解的唯一方法是打印检查这一行:

尝试这样做:

print add_selection[index], add_selection[index+1]
print type(add_selection[index]),type(add_selection[index+1])

EDIT2:

更好地查看代码,有两件事可能会对您的程序造成影响。

1)轻松入侵

AddFunction更改:

return add_selection[0]

return eval(add_selection[0])

由于AddFunction返回'9+1' <type str>,因此使用eval会将此值计算为10 <type int>。实际上,您可以移除整个AddFunction并使用DisplayAnswer = float(eval(Validate_Input))。但请注意,这是dirty trick and a hack

2)重写

我注意到您正在使用add_Components中的每个按钮显示信息(字符串),但也作为按下每个按钮时的值,从而将操作符与新值连接起来。 operator += self.value

但主要问题是你处理的是字符串而不是整数,当你将按钮的值设置为'1'时,它与设置为1不一样,你应该将程序更改为使用值的正确类型,数字为整数,运算符的字符串。然后,您将不得不重写AddFunction与两者一起工作的方式。

最后,你operator作为一个全局变量真的不受欢迎,并可能导致进一步的问题。