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函数和索引有关吗?
答案 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
作为一个全局变量真的不受欢迎,并可能导致进一步的问题。