import tkinter import tkinter.messagebox import math ''' 波波版计算器可实现的功能 1.能进行简单的加减惩处 2.能进行开根号操作 3.能进行后退操作,但不完美 4.能进行清空操作 5.可以连续开根号 解决的bug 5.连续错按运算符号之后按最后一个运算符运算 6.连续按等于号可以连乘3×3=9 再按等号9再一次×3 7.不能连续按点号,否则无效 8.除数不能为0 9.连续按正负号,面板中的数字变号 注意: 10.显示面板只能显示16个符号 bug 很多,请不要联系我 微信号:zb983978082 ''' class jsq: ''' 方法 运算(=) 按数字 按运算符 界面布局 ''' #界面布局方法 def __init__(self): #创建主界面 并保存到对象成员属性中 self.root = tkinter.Tk() self.root.minsize(300, 380) self.root.title('波波版计算器') #设置显示面板的变量 self.result = tkinter.StringVar() self.result.set(0) # 设置一个全局变量 运算数字和符号的列表 列表可以穿透函数 不需要全局变量声明global self.lists = [] # 添加一个用于判断是否按下运算符号的标志 self.isPressSign = False #添加一个用于判断是否按下等于符号的标志 self.isPressEqual = False #添加一个用于判断是否按下了小数点的标志 self.isPressDot = False #添加一个用于判断是否按下正负号的标志 self.ispressFuHao = False #添加一个用于判断上一次是否按下除号的标志 self.isPressChu = False #界面布局 self.layout() self.root.mainloop() #界面组件摆放 def layout(self): #显示面板 #========================================== 菜单 =================================================== #添加总菜单 allmenu = tkinter.Menu(self.root) #添加子菜单 helpmenu = tkinter.Menu(allmenu,tearoff = 0) allmenu.add_cascade(label = '帮助H',menu = helpmenu) #添加选项卡 helpmenu.add_command(label = '查看帮助',command = self.pressHelp) #摆放菜单 self.root.config(menu = allmenu ) #标签 label = tkinter.Label(self.root, textvariable=self.result, bg='white', font=('黑体', 20), anchor='e') label.place(x=20, y=20, width=260) # ===================================数字============================================================= btn1 = tkinter.Button(self.root, text='1', command=lambda: self.pressNum('1')) btn1.place(x=20, y=140, width=50, height=40) btn2 = tkinter.Button(self.root, text='2', command=lambda: self.pressNum('2')) btn2.place(x=90, y=140, width=50, height=40) btn3 = tkinter.Button(self.root, text='3', command=lambda: self.pressNum('3')) btn3.place(x=160, y=140, width=50, height=40) btn4 = tkinter.Button(self.root, text='4', command=lambda: self.pressNum('4')) btn4.place(x=20, y=200, width=50, height=40) btn5 = tkinter.Button(self.root, text='5', command=lambda: self.pressNum('5')) btn5.place(x=90, y=200, width=50, height=40) btn6 = tkinter.Button(self.root, text='6', command=lambda: self.pressNum('6')) btn6.place(x=160, y=200, width=50, height=40) btn7 = tkinter.Button(self.root, text='7', command=lambda: self.pressNum('7')) btn7.place(x=20, y=260, width=50, height=40) btn8 = tkinter.Button(self.root, text='8', command=lambda: self.pressNum('8')) btn8.place(x=90, y=260, width=50, height=40) btn9 = tkinter.Button(self.root, text='9', command=lambda: self.pressNum('9')) btn9.place(x=160, y=260, width=50, height=40) btn0 = tkinter.Button(self.root, text='0', command=lambda: self.pressNum('0')) btn0.place(x=20, y=320, width=50, height=40) # =================================== 运算符号 =========================================================== #加号 btnjia = tkinter.Button(self.root, text='+', command=lambda: self.pressOperation('+')) btnjia.place(x=230, y=80, width=50, height=40) #减号 btnjian = tkinter.Button(self.root, text='-', command=lambda: self.pressOperation('-')) btnjian.place(x=230, y=140, width=50, height=40) #乘法 btncheng = tkinter.Button(self.root, text='×', command=lambda: self.pressOperation('*')) btncheng.place(x=230, y=200, width=50, height=40) #除法 btnchu = tkinter.Button(self.root, text='/', command=lambda: self.pressOperation('/')) btnchu.place(x=230, y=260, width=50, height=40) #等号 btneq = tkinter.Button(self.root, text='=', command=lambda: self.pressEqual()) btneq.place(x=230, y=320, width=50, height=40) # ========================================== 其他符号 ======================================== #后退 btnback = tkinter.Button(self.root, text='←', command=lambda: self.pressBack()) btnback.place(x=20, y=80, width=50, height=40) #开根号 btngenhao = tkinter.Button(self.root, text='√',command = lambda: self.presssqrt()) btngenhao.place(x=90, y=80, width=50, height=40) #清空符号 btnclear = tkinter.Button(self.root, text='C', command=lambda: self.pressClear()) btnclear.place(x=160, y=80, width=50, height=40) #正负号 btn10 = tkinter.Button(self.root, text='±', command=lambda: self.pressFuHao('-1')) btn10.place(x=90, y=320, width=50, height=40) #小数点 btndot = tkinter.Button(self.root, text='.', command=lambda: self.pressDot('.')) btndot.place(x=160, y=320, width=50, height=40) #数字方法 def pressNum(self,num): if self.isPressChu == True and num == '0': tkinter.messagebox.showerror('错误','除数不能为0') else: # 判断是否按下了运算符号 if self.isPressSign == False: pass else: self.result.set(0) # 重置运算符号的状态 self.isPressSign = False if self.isPressEqual == False: pass else: self.result.set(0) self.isPressEqual = False # 获取面板中的原有数字 oldnum = self.result.get() #self.result.get() # 判断界面数字是否为0 if oldnum == '0': self.result.set(num) else: #连接上新按下的数字 num 和oldnum都是字符串 newnum = oldnum + num #将按下的数字写到面板中 self.result.set(newnum) #运算函数 def pressOperation(self,sign): if sign == '/': self.isPressChu = True # 保存已经按下的数字和运算符号 #判断上一次操作按下的是否是运算符 if self.isPressSign == True: #默认删除最后一个元素 这一步操作作用是在用户多次选取运算符只取最后一个运算符 self.lists.pop() else: # 获取界面数字 num = self.result.get() #获取之后的界面数字保存到列表里面 self.lists.append(num) #print(self.lists) # 保存按下的操作符号 self.lists.append(sign) print(self.lists) #i = self.lists[0] #j = self.lists[-1] #self.newlists.append(i) #self.newlists.append(j) #print(self.lists) # 设置运算符为按下状态 self.isPressSign = True # 获取运算结果 def pressEqual(self): try: if self.isPressEqual == True: curnum2 = self.result.get() self.lists.append(curnum2) for k in self.lists2: self.lists.append(k) # 将列表转化为字符串 strvar = ''.join(self.lists) # 使用eval执行字符串中的运算即可 endNum = eval(strvar) # 将运算结果显示在界面中 self.result.set(endNum) else: # 获取所有列表中的内容 (之前的数字和操作) curnum = self.result.get() # 将当前界面的数字存入列表 self.lists.append(curnum) #self.newlists = list(self.lists[0]+self.lists[-2:]) print(self.lists) self.lists2 = self.lists[-2:] # 将列表转化为字符串 strvar = ''.join(self.lists) # 使用eval执行字符串中的运算即可 endNum = eval(strvar) # 将运算结果显示在界面中 self.result.set(endNum) self.isPressEqual = True # 清空运算列表 self.lists.clear() except: tkinter.messagebox.showerror('错误', '程序出现错误') #清空操作 def pressClear(self): #把界设置为0 self.result.set(0) #清空列表 self.lists.clear() # 后退操作 def pressBack(self): # 获取面板中的数值字符串 if self.isPressEqual == True: pass else: strvar2 = self.result.get() strvar3 = strvar2[:-1] if len(strvar3) == 0: self.result.set(0) else: self.result.set(strvar3) def pressDot(self,dot): if self.isPressDot == True: pass else: # 获取面板中的原有数字 oldnum = self.result.get() # 连接上新按下的数字 dot 和 oldnum都是字符串 newnum = oldnum + dot # 将按下的数字写到面板中 self.result.set(newnum) self.isPressDot = True def pressFuHao(self,fuhao): try: if self.result.get() == '': pass else: # 获取面板中的原有数字 oldnum = self.result.get() # 连接上新按下的数字 dot 和 oldnum都是字符串 newnum = float(fuhao) * float(oldnum) print(newnum,type(newnum)) # 将按下的数字写到面板中 self.result.set(str(newnum)) except: tkinter.messagebox.showerror('错误', '程序出现错误') def presssqrt(self): try: strvar3 = self.result.get() floatvar1 = float(strvar3) if floatvar1 < 0: tkinter.messagebox.showwarning('警告','负数不能开根号') else: self.result.set(math.sqrt(floatvar1)) except: tkinter.messagebox.showerror('错误', '程序出现错误') def pressHelp(self): self.val1 = tkinter.StringVar() newwindows = tkinter.Toplevel(bg='white') newwindows.title('计算器说明.txt') newwindows.minsize(350, 450) # 打开文件 zp = open('./计算器说明.txt', 'r') self.shuoming = zp.read() print(self.shuoming, type(self.shuoming)) self.val1.set(self.shuoming) label = tkinter.Label(newwindows, bg='white', textvariable=self.val1, font=('黑体', 10), anchor='nw',justify='left') label.place(x=10, y=10) #实例化对象 myjsq = jsq()