python编写计算器,供大家参考,具体内容如下
(1)计算器界面如下:
(2)基本满足了计算器的所有需求,使用时不可键盘输入,只能鼠标点击左键才可执行。初始时显示0.0,每次输入的内容存于D:\\num.txt(启动程序时自动创建)
(3)\” AC \” 记录清零返回初始 0.0;\” delete \” 删除上一个输入内容;\” +/- \” 将正数为负数,负数为正数
(4)对于不同的进制数值系统,小数的精准值不同。因此计算机会出现 0.1+0.2=0.3000000000004 的现象能对数据进行截断处理,可以解决问题,但精度丧失。(此计算机没有进行截断处理)
import tkinter,osfrom tkinter import * def temp(string):#空白间隔 temp=tkinter.Frame(string,width=20,height=50) temp.pack() flag=0node=0def num_work(): #更新显示框Lable global flag global node with open(\"D:\\\\num.txt\") as f: for length in f: string=length top_work.configure(text=string.strip(\'\\n\')) # 重新设置标签文本 root.after(500,num_work) # 每隔0.5s调用函数num_work自身获取结果 def num_math_int(num1,num2):#整数运算 try: if num2[0]==\'+\': string=int(num1)+int(num2[1:]) elif num2[0]==\'-\': string=int(num1)-int(num2[1:]) elif num2[0]==\'x\': string=int(num1)*int(num2[1:]) elif num2[0]==\'/\': string=int(num1)/int(num2[1:]) with open(\"D:\\\\num.txt\",\'a\') as f: f.write(\'\\n\'+str(string)+\'\\n\') except: with open(\"D:\\\\num.txt\",\'a\') as f: f.write(\'\\n错误\')def num_math_float(num1,num2):#小数运算 try: if num2[0]==\'+\': string=float(num1)+float(num2[1:]) elif num2[0]==\'-\': string=float(num1)-float(num2[1:]) elif num2[0]==\'x\': string=float(num1)*float(num2[1:]) elif num2[0]==\'/\': string=float(num1)/float(num2[1:]) if flag==0: with open(\"D:\\\\num.txt\",\'a\') as f: f.write(\'\\n\'+str(string)+\'\\n\') else: with open(\"D:\\\\num.txt\",\'a\') as f: f.write(\'\\n\'+str(string)) except: with open(\"D:\\\\num.txt\",\'a\') as f: f.write(\'\\n错误\')def decimal(num): if num.count(\'%\')>0: num=num.replace(\'%\',\'\') num=num.replace(\'\\n\',\'\') if num.isnumeric(): num=str(float(num)/100) else: num=num[0]+str(float(num[1:])/100) return num def work(string):#按键对应的功能 if string.isnumeric(): with open(\"D:\\\\num.txt\",\"a\") as file: file.write(string) else: #读取文件D:\\\\num.txt所有内容 lists=[] with open(\"D:\\\\num.txt\",\"r\") as file: for length in file: lists.append(length) if string==\'AC\': with open(\"D:\\\\num.txt\",\"w\") as file: file.write(\'0.0\\n\') elif string==\'=\': num1=lists[-2] num2=lists[-1] if num1==\'\\n\':#解决末尾为换行的情况 num1=lists[-3] #将百分数小数化 #出现结果多0.0000000001 num1=decimal(num1) num2=decimal(num2) try: #判断两个数是整数还是小数 number=int(num1) number=int(num2[1:]) num_math_int(num1,num2)#两个数进行整数运算 except: num_math_float(num1,num2)#两个数进行小数运算 elif string==\'.\': if lists[-1].count(\'.\')==0:#判断结尾是否有小数点,没有写入否则报错 with open(\"D:\\\\num.txt\",\"a\") as file: file.write(string) else: with open(\"D:\\\\num.txt\",\"a\") as file: file.write(\'\\n错误\') elif string==\'+/-\': if lists[-1].count(\'-\')==0:#-+为- if lists[-1].count(\'+\')==1: lists[-1]=lists[-1].replace(\'+\',\'\') lists[-1]=\'-\'+lists[-1] else: #--为+ lists[-1]=lists[-1].replace(\'-\',\'+\') #更新文件 with open(\"D:\\\\num.txt\",\"w\") as file: pass for length in lists: with open(\"D:\\\\num.txt\",\"a\") as file: file.write(length) elif string==\'delete\': number=lists[-1] lists[-1]=number[0:(len(number)-1)]#删除一位 #更新文件 with open(\"D:\\\\num.txt\",\"w\") as file: pass for length in lists: with open(\"D:\\\\num.txt\",\"a\") as file: file.write(length) elif string==\'%\': if lists[-1].endswith(\"%\")==False: with open(\"D:\\\\num.txt\",\"a\") as file: file.write(string) else: with open(\"D:\\\\num.txt\",\"a\") as file: file.write(\'\\n错误\') else: with open(\"D:\\\\num.txt\",\"a\") as file: file.write(\'\\n\'+string) def run():#计算器显示界面主体 if os.path.exists(\"D:\\\\num.txt\")==False: with open(\"D:\\\\num.txt\",\'w\') as f: f.write(\'0.0\\n\') global root#定义全局变量root,方便Label更新 root=tkinter.Tk() root.title(\"计算器\") #x = root.winfo_screenwidth() #获取当前屏幕的宽 #y = root.winfo_screenheight() #获取当前屏幕的高 #print(((x-500)//2),((y-600)//2))#为居中提供的参数 root.geometry(\'400x500+760+290\')#主体长400,高500,居中 top=tkinter.Frame(root,width=20,height=50) top.pack() global top_work#定义全局变量root temp(top)#空白间隔 #计算器显示框 top_work=tkinter.Label(top,text=\'\',justify=\'left\',relief=SUNKEN,bd=10,bg=\'white\',width=40) top_work.pack(side=\'bottom\')#计算器显示框(位置居下) num_work() temp(root)#空白间隔 number=tkinter.Frame(root)#成放计算机键盘的容器 number.pack() #所有按键,AC键为事例 numberAC=tkinter.Button(number,text=\"AC\",width=10,command=lambda : work(\'AC\')).grid(row=0,column=0) #左键点击,执行函数work #按键位置(0,0) numberdelete=tkinter.Button(number,text=\"delete\",width=10,command=lambda : work(\'delete\')).grid(row=0,column=1) numberzhengfu=tkinter.Button(number,text=\"+/-\",width=10,command=lambda : work(\'+/-\')).grid(row=0,column=2) numberchu=tkinter.Button(number,text=\"/\",width=10,command=lambda : work(\'/\')).grid(row=0,column=3) tkinter.Button(number,text=\"7\",width=10,command=lambda : work(\'7\')).grid(row=1,column=0) tkinter.Button(number,text=\"8\",width=10,command=lambda : work(\'8\')).grid(row=1,column=1) tkinter.Button(number,text=\"9\",width=10,command=lambda : work(\'9\')).grid(row=1,column=2) tkinter.Button(number,text=\"x\",width=10,command=lambda : work(\'x\')).grid(row=1,column=3) tkinter.Button(number,text=\"4\",width=10,command=lambda : work(\'4\')).grid(row=2,column=0) tkinter.Button(number,text=\"5\",width=10,command=lambda : work(\'5\')).grid(row=2,column=1) tkinter.Button(number,text=\"6\",width=10,command=lambda : work(\'6\')).grid(row=2,column=2) tkinter.Button(number,text=\"-\",width=10,command=lambda : work(\'-\')).grid(row=2,column=3) tkinter.Button(number,text=\"1\",width=10,command=lambda : work(\'1\')).grid(row=3,column=0) tkinter.Button(number,text=\"2\",width=10,command=lambda : work(\'2\')).grid(row=3,column=1) tkinter.Button(number,text=\"3\",width=10,command=lambda : work(\'3\')).grid(row=3,column=2) tkinter.Button(number,text=\"+\",width=10,command=lambda : work(\'+\')).grid(row=3,column=3) tkinter.Button(number,text=\"%\",width=10,command=lambda : work(\'%\')).grid(row=4,column=0) tkinter.Button(number,text=\"0\",width=10,command=lambda : work(\'0\')).grid(row=4,column=1) tkinter.Button(number,text=\".\",width=10,command=lambda : work(\'.\')).grid(row=4,column=2) tkinter.Button(number,text=\"=\",width=10,command=lambda : work(\'=\')).grid(row=4,column=3) root.mainloop()if __name__==\'__main__\': run()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。