python编写计算器,供大家参考,具体内容如下
(1)计算器界面如下:
(2)基本满足了计算器的所有需求,使用时不可键盘输入,只能鼠标点击左键才可执行。初始时显示0.0,每次输入的内容存于D:\num.txt(启动程序时自动创建)
(3)" AC " 记录清零返回初始 0.0;" delete " 删除上一个输入内容;" +/- " 将正数为负数,负数为正数
(4)对于不同的进制数值系统,小数的精准值不同。
因此计算机会出现 0.1+0.2=0.3000000000004 的现象
能对数据进行截断处理,可以解决问题,但精度丧失。
(此计算机没有进行截断处理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 | import tkinter,os from tkinter import * def temp(string): #空白间隔 temp = tkinter.Frame(string,width = 20 ,height = 50 ) temp.pack() flag = 0 node = 0 def 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() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/189234/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)