1 import tkinter 2 import tkinter.messagebox 3 import math 4 class JSQ: 5 6 7 def __init__(self): 8 #创建主界面 9 self.root = tkinter.Tk() 10 self.root.minsize(270, 330) 11 self.root.maxsize(270, 330) 12 self.root.title('小可乐的计算器') 13 #定义一个变量赋值给页面label 14 self.result = tkinter.StringVar() 15 #界面先显示个0 16 self.result.set(0) 17 # 设置一个全局变量 运算数字和符号的列表 18 self.lists = [] 19 # 添加一个判断是否按下运算符号的标志 20 self.isPressSign = False 21 # 添加一个判断是否运算完毕的标志,如果运算完毕在获取数字的方法中会清空上一轮运算结果 22 self.islistsclear = False 23 # 添加一个判断百分号是否使用的功能 24 self.isbaifenhao = False 25 # 为了下面的百分号方法使用(在百分号中为按下运算符号之后的数字) 26 self.num1 = '' 27 # 定义一个全局变量(获取百分好的结果)为了在‘=’运算的时候输出 28 self.result3 = None 29 # 获取运算符号之前的数字 30 self.num = '' 31 # 获取运算符号给百分好方法使用 32 self.sign1 = '' 33 self.layout() 34 self.menubar() 35 #将窗口一直显示 36 self.root.mainloop() 37 38 def menubar(self): 39 # 创建总菜单 40 allmenu = tkinter.Menu(self.root) 41 # 创建子菜单 42 filemenu = tkinter.Menu(allmenu, tearoff=0) 43 # 在子菜单里添加文件 44 filemenu.add_command(label='标准型(T) Alt+1',command = lambda : self.func2()) 45 filemenu.add_command(label='科学性(S) Alt+2',command = lambda : self.func2()) 46 filemenu.add_command(label='程序员(p) Alt+3',command = lambda : self.func2()) 47 filemenu.add_command(label='统计信息(A) Alt+4',command = lambda : self.func2()) 48 # 创建分割线 49 filemenu.add_separator() 50 filemenu.add_command(label='历史记录(Y) Ctrl+H',command = lambda : self.func2()) 51 filemenu.add_command(label='数学分组(I)',command = lambda : self.func2()) 52 filemenu.add_separator() 53 filemenu.add_command(label='基本(B) Ctrl+F4',command = lambda : self.func2()) 54 filemenu.add_command(label='单位转换(U) Ctrl+U',command = lambda : self.func2()) 55 filemenu.add_command(label='日期计算(D) Ctrl+E',command = lambda : self.func2()) 56 # 在子菜单里再创建一个菜单 57 filemenunei = tkinter.Menu(filemenu, tearoff=0) 58 # 在子菜单里的菜单添加文件 59 filemenunei.add_command(label='抵押(M)',command = lambda : self.func2()) 60 filemenunei.add_command(label='汽车租赁(V)',command = lambda : self.func2()) 61 filemenunei.add_command(label='油耗(mpg)(F)',command = lambda : self.func2()) 62 filemenunei.add_command(label='油耗(1/100km)(U)',command = lambda : self.func2()) 63 # 将子菜单里的菜单添加到子菜单里 64 filemenu.add_cascade(label='工作表(W)', menu=filemenunei) 65 # 添加退出功能 66 filemenu.add_command(label='退出', command=self.root.quit) 67 # 将子菜单添加到总菜单里 68 allmenu.add_cascade(label='查看(V)', menu=filemenu) 69 # 再创建一个子菜单 70 editmenu = tkinter.Menu(allmenu, tearoff=0) 71 # 在子菜单里添加文件 72 editmenu.add_command(label='复制(C)',command = lambda : self.func2()) 73 editmenu.add_command(label='粘贴(P)',command = lambda : self.func2()) 74 # 创建分割线 75 editmenu.add_separator() 76 # 在子菜单里创建一个菜单 77 editmenunei = tkinter.Menu(editmenu, tearoff=0) 78 # 在子菜单里的菜单添加文件 79 editmenunei.add_command(label='复制历史记录(I)', stat='disable') 80 editmenunei.add_command(label='编辑(E) F2', stat='disable') 81 editmenunei.add_command(label='取消编辑(N) Esc', stat='disable') 82 editmenunei.add_command(label='清除(L) Ctrl+Shift+D', stat='disable') 83 # 将子菜单里的菜单添加到子菜单 84 editmenu.add_cascade(label='历史记录(H)', menu=editmenunei) 85 # 将子菜单添加到总菜单 86 allmenu.add_cascade(label='编辑(E)', menu=editmenu) 87 # 创建第三个子菜单 88 helpmenu = tkinter.Menu(allmenu, tearoff=0) 89 # 在第三个子菜单里添加文件 90 helpmenu.add_command(label='查看帮助(v) F1',command = lambda : self.func2()) 91 # 创建分割线 92 helpmenu.add_separator() 93 helpmenu.add_command(label='关于计算器(A)',command = lambda : self.func2()) 94 # 将第三个子菜单添加到总菜单中 95 allmenu.add_cascade(label='帮助(H)', menu=helpmenu) 96 # 将总菜单布局到主窗口 97 self.root.config(menu=allmenu) 98 99 # 下面代码用于页面布局 100 def layout(self): 101 #显示结果的标签 102 label = tkinter.Label(self.root, textvariable=self.result, bg='white', font=('黑体', 10), anchor='e') 103 label.place(x=20, y=10, width=230, height=30) 104 105 btnmc = tkinter.Button(self.root, text='MC',command = lambda : self.func2()) 106 btnmc.place(x=20, y=50, width=30, height=30) 107 108 btnmr = tkinter.Button(self.root, text='MR',command = lambda : self.func2()) 109 btnmr.place(x=70, y=50, width=30, height=30) 110 111 btnms = tkinter.Button(self.root, text='MS',command = lambda : self.func2()) 112 btnms.place(x=120, y=50, width=30, height=30) 113 114 btnmjia = tkinter.Button(self.root, text='M+',command = lambda : self.func2()) 115 btnmjia.place(x=170, y=50, width=30, height=30) 116 117 btnmjian = tkinter.Button(self.root, text='M-',command = lambda : self.func2()) 118 btnmjian.place(x=220, y=50, width=30, height=30) 119 120 btnjiantou = tkinter.Button(self.root, text='←', command=lambda: self.jiantou()) 121 btnjiantou.place(x=20, y=90, width=30, height=30) 122 123 btnce = tkinter.Button(self.root, text='CE', command=lambda: self.CE()) 124 btnce.place(x=70, y=90, width=30, height=30) 125 126 btnc = tkinter.Button(self.root, text='C', command=lambda: self.clears()) 127 btnc.place(x=120, y=90, width=30, height=30) 128 129 btnzhengfu = tkinter.Button(self.root, text='±', command=lambda: self.zhenffu()) 130 btnzhengfu.place(x=170, y=90, width=30, height=30) 131 132 btnkaigen = tkinter.Button(self.root, text='√', command=lambda: self.sqrts()) 133 btnkaigen.place(x=220, y=90, width=30, height=30) 134 135 btn7 = tkinter.Button(self.root, text='7', command=lambda: self.pressNum('7')) 136 btn7.place(x=20, y=130, width=30, height=30) 137 138 btn8 = tkinter.Button(self.root, text='8', command=lambda: self.pressNum('8')) 139 btn8.place(x=70, y=130, width=30, height=30) 140 141 btn9 = tkinter.Button(self.root, text='9', command=lambda: self.pressNum('9')) 142 btn9.place(x=120, y=130, width=30, height=30) 143 144 btnchu = tkinter.Button(self.root, text='/', command=lambda: self.pressCompute('/')) 145 btnchu.place(x=170, y=130, width=30, height=30) 146 147 btnbaifen = tkinter.Button(self.root, text='%', command=lambda: self.baifenhao()) 148 btnbaifen.place(x=220, y=130, width=30, height=30) 149 150 btn4 = tkinter.Button(self.root, text='4', command=lambda: self.pressNum('4')) 151 btn4.place(x=20, y=170, width=30, height=30) 152 153 btn5 = tkinter.Button(self.root, text='5', command=lambda: self.pressNum('5')) 154 btn5.place(x=70, y=170, width=30, height=30) 155 156 btn6 = tkinter.Button(self.root, text='6', command=lambda: self.pressNum('6')) 157 btn6.place(x=120, y=170, width=30, height=30) 158 159 btncheng = tkinter.Button(self.root, text='*', command=lambda: self.pressCompute('*')) 160 btncheng.place(x=170, y=170, width=30, height=30) 161 162 btnfenshu = tkinter.Button(self.root, text='1/X', command=lambda: self.fenshu()) 163 btnfenshu.place(x=220, y=170, width=30, height=30) 164 165 btn1 = tkinter.Button(self.root, text='1', command=lambda: self.pressNum('1')) 166 btn1.place(x=20, y=210, width=30, height=30) 167 168 btn2 = tkinter.Button(self.root, text='2', command=lambda: self.pressNum('2')) 169 btn2.place(x=70, y=210, width=30, height=30) 170 171 btn3 = tkinter.Button(self.root, text='3', command=lambda: self.pressNum('3')) 172 btn3.place(x=120, y=210, width=30, height=30) 173 174 btnjian = tkinter.Button(self.root, text='-', command=lambda: self.pressCompute('-')) 175 btnjian.place(x=170, y=210, width=30, height=30) 176 177 btndenghao = tkinter.Button(self.root, text='=', command=lambda: self.pressEqual()) 178 btndenghao.place(x=220, y=210, width=30, height=70) 179 180 btn0 = tkinter.Button(self.root, text='0', command=lambda: self.pressNum('0')) 181 btn0.place(x=20, y=250, width=80, height=30) 182 183 btndian = tkinter.Button(self.root, text='.', command=lambda: self.pressNum('.')) 184 btndian.place(x=120, y=250, width=30, height=30) 185 186 btnjia = tkinter.Button(self.root, text='+', command=lambda: self.pressCompute('+')) 187 btnjia.place(x=170, y=250, width=30, height=30) 188 189 # 数字函数(获取数字的函数) 190 def pressNum(self,num): 191 # 下面的百分好会用到 192 self.num1 = num 193 # 判断是否按下运算符号 194 if self.isPressSign == False: 195 pass 196 #如果按下运算符号界面归0 197 else: 198 self.result.set(0) 199 self.isPressSign = False 200 # 判断运算是否完毕 201 if self.islistsclear == False: 202 # 获取面板上原有的数字 203 oldNum = self.result.get() 204 # 判断原有数字是否为零 205 if oldNum == '0': 206 #将传入的数字显示 207 self.result.set(num) 208 else: 209 #原来的数字加上现在输入的数字 210 newNum = oldNum + num 211 self.result.set(newNum) 212 # 运算完毕界面自动清空 213 else: 214 # lists.clear()#如果添加这行代码就不能在上一轮运算结果的基础上运算了 215 self.result.set('0') 216 self.islistsclear = False 217 self.result.set(num) 218 219 # 运算操作(获取运算符号然后将数字和符号添加到列表中) 220 def pressCompute(self,sign): 221 # 获取界面上的数字 222 if True: 223 #获取输入运算符之前的数字 224 self.num = self.result.get() 225 #将数字加入列表之中 226 self.lists.append(self.num) 227 #将运算符加入到列表之中 228 self.lists.append(sign) 229 #将运算符赋值给sign1(下面的百分号方法会用到) 230 self.sign1 = sign 231 #将是否按下运算符号标志改成True 232 self.isPressSign = True 233 # 在刚开始的时候添加一个负号(-)用于正负好转换使用 234 #如果列表第一位为0 235 if self.lists[0] == '0': 236 #如果列表第二位为‘-’ 237 if self.lists[1] == '-': 238 self.result.set('-') 239 # 设置运算符号的状态 240 self.isPressSign = False 241 242 # 获取运算结果(将列表内的值转换为字符串,然后将字符串用python代码执行) 243 def pressEqual(self): 244 # 获取当前页面的数字 245 curnum = self.result.get() 246 self.lists.append(curnum) 247 #将列表中的数据转换为字符串 248 computeStr = ''.join(self.lists) 249 #将字符串用python代码执行 250 endNum = eval(computeStr) 251 #界面显示结果 252 self.result.set(endNum) 253 #如果百分号标志触发 254 if self.isbaifenhao == True: 255 #界面显示self.result3 256 self.result.set(self.result3) 257 #运算结束后将列表清空 258 self.lists.clear() 259 #将运算标志改成True 260 self.islistsclear = True 261 262 # 清空运算 263 def clears(self): 264 self.lists.clear() 265 self.result.set('0') 266 267 # 删除上一位数字 268 def CE(self): 269 self.result.set('0') 270 271 # 用于更改数的正负值 272 def zhenffu(self): 273 self.result1 = self.result.get() 274 self.result.set(float(self.result1) * (-1)) 275 self.islistsclear = True 276 277 # 用于开平方运算 278 def sqrts(self): 279 result1 = self.result.get() 280 self.result.set(math.sqrt(float(result1))) 281 self.lists.clear() 282 self.islistsclear = True 283 284 # 用于求x/9的值 285 def fenshu(self): 286 result1 = self.result.get() 287 self.result.set(1 / float(result1)) 288 self.islistsclear = True 289 290 #用于求百分号功能的方法 291 def baifenhao(self): 292 listss = [] 293 # 判断如果输入一个数没输运算符号的话界面自动归零 294 if len(self.lists) < 1: 295 self.result.set(0) 296 else: 297 #获取输入运算符号之前的数字 298 a1 = float(self.num) 299 #获取运算符号 300 a2 = self.sign1 301 302 #再次获取输入运算符号之前的数字 303 a3 = float(self.num) 304 305 a4 = '*' 306 #算出最后一个数字的百分数 307 a6 = float(self.num1) / 100 308 309 #算出百分号的那个结果 310 resultmuqian = a3 * a6 311 #总结果 312 resultbai = str(a1) + a2 + str(a3) + a4 + str(a6) 313 #将字符串用python代码执行 314 self.result3 = eval(resultbai) 315 #在界面上按下%符号是显示的结果 316 self.result.set(resultmuqian) 317 #改变百分号的标志 318 self.isbaifenhao = True 319 320 #箭头的意义删除后一位数字 321 def jiantou(self): 322 result1 = self.result.get() 323 result1 = list(result1) 324 del result1[-1] 325 result1 = str(result1) 326 self.result.set(result1) 327 328 def func2(self): 329 tkinter.messagebox.askokcancel(title = '略过',message='没实现') 330 331 332 myjsq = JSQ()
好了,以上便是利用Python代码实现一个计算器小程序的过程。