49条python语句实现非函数计算器(发现错已改)

tech2022-10-10  94

用python的tkinte实现了一个能完成加、减、乘、除,类似手机中的的计算器,能自动改正输入错误,仅用了49条语句。运行界面如下。

为了实现这个计算器,要完成3个功能: 1.用tkinte控件实现计算器界面,用来输入要计算的算数表达式并显示。 2.要检查算数表达式格式是否正确,以保证能够计算算数表达式的值。 3.计算算数表达式的值并显示。 计算器界面包括18个按钮控件和1个label控件。label控件用来显示输入的表达式,按text为=的按钮后显示计算结果。用循环方法生成18个按钮控件对象,按5行4列排列,这些按钮text属性依次分别是:c←÷×789-456+123=0.。所有按钮使用同1个事件函数,事件函数有1个参数,是按钮的text属性值,根据这个参数,事件函数可以区分是那个按钮被单击,把其text属性值添加到label属性text中,添加时要做格式检查。 用函数eval(s)计算输入的算数表达式的值,但前提是算数表达式的格式能满足函数eval要求。这要求在输入算数表达式时就要检查格式以满足函数eval要求,同时也希望输入的算数表达式格式符合习惯。 算数表达式就是把整数或浮点数用运算符加、减、乘、除连接在一齐。计算器通过18个按钮输入算数表达式,表达式保存到label的text属性中,实际是字符串。初始label的text属性为空。单击某按钮,就把该按钮的text属性内容添加到label的text属性中。先输入整数或浮点数,每输入一个数字或小数点,都要进行格式检查,确保输入的整数或浮点数格式正确,输入一个运算符,表示一个正确的整数或浮点数完成输入,继续输入下一个整数或浮点数,因前边输入的整数或浮点数格式正确,此时只需对新输入的整数或浮点数做格式检查。如从label的text属性中保存的有多个整数或浮点数的算数表达式去检查新输入的整数或浮点数,很不方便。因此可把保存到label属性text中的算数表达式用运算符加、减、乘、除分割为若干整数或浮点数存到列表中,取出列表最后的整数或浮点数,即正在输入的整数或浮点数,检查其格式是否正确,应该更容易。具体代码如下: import re s1=re.split(r’+|-|×|÷|]’,s)[-1]***#÷后加|,原来没有*** 该函数用运算符+、-、×、÷分割字符串s为多个子字符串存到列表中,取出末项(即正在输入的整数或浮点数)保存到s1中。函数split的第1个参数字符串是正则表达式,字符串前的r表示字符串中字符不转义,例如,如有\n原是换行符,加r后就是\和n,没有换行的意思了。字符+在正则表达式中有其它意义,而\+表示其就是+号,用来分割字符串。r’+|-|×|÷|]‘表示分割所有数字,而r’[+|-|×|÷|]'表示只分割第一个数字。 全部代码如下。

import tkinter import re def btnClick(x): #所有按钮的事件函数,有1个参数是被点击按钮标题 s=label['text'] s1= re.split(r'\+|-|×|÷|]',s)[-1]#用运算符分割label标题存到列表,取出末项 if x in '0123456789': if '.' not in s1 and s1.startswith('0'): #去掉整数前的0 s=s[0:-1] label['text']=s+x elif x == '.': if '.' in s1: #浮点数只能有1个小数点 return if s1=='': #第一次输入小数点,在其前边增加0 label['text']+='0.' else: label['text']+='.' elif x in ['+','-','×','÷']: if s[-1] in ['+','-','×','÷']: #两个运算符不能相邻 return if s[-1]=='.': #其前边是小数点,增加0 label['text']+=('0'+x) else: label['text']+=x elif x=='←': label['text']=s[0:-1] #删掉最后1项 elif x=='c': label['text']='' else: #最后是单击=键 if s[-1] in ['+','-','×','÷']: #最后一个字符是运算符,eval计算出错 s=s[0:-1] #删掉这个运算符 s=s.replace('×','*',s.count('×')) #eval不认识运算符×和÷,替换为*和/ s=s.replace('÷','/',s.count('÷')) label['text']=str(eval(s)) root = tkinter.Tk() root.title('计算器') #窗口标题 root.geometry("320x370") #窗口宽320,高=370 root.resizable(width=False,height=False) #设置窗口是否可变,宽不可变,高不可变,默认为True label=tkinter.Label(root,text='',fg='red',font=("Arial",20),anchor="e") label.place(x=20,y=10,width=280,height=40) numbers=list('.0=321+654-987×÷←c') #列表,所有按钮标题 for row in range(5): #row=行,0,1,2,3,4 for col in range(4): #col=列,0,1,2,3 if row==4 and col==2: break s=numbers.pop() button=tkinter.Button(root,command=lambda x=s:btnClick(x),fg='red',font=("Arial",20)) button['text']=s #将列表numbers最后一项作为按钮标题并将列表最后1项删除 button.place(x=45+col*60,y=60+row*60,width=50,height=50) root.mainloop()

本程序未对除0做检查,当算数表达式有除0运算,当按=后,在IDLE中会报错,但显示字符串不做修改,可继续使用。当然也可在程序中做出判断。

最新回复(0)