zoukankan      html  css  js  c++  java
  • python 简易计算器

    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()
    
  • 相关阅读:
    Guava布隆过滤器实战应用
    结合阿里代码规范约定+源码剖析属性拷贝性能安全问题
    comparatorChain实现对Bean多字段排序
    python ibm_db模块的使用
    Linux6.5编译安装mysql5.7.19
    3.1 创建预配置管理资料数据库
    redis环境搭建及一主二从三哨兵模式配置
    一次生产环境搭建11g RAC的记录
    绑定变量
    oracle 10g 搭建备库以及一次DG GAP的处理情况
  • 原文地址:https://www.cnblogs.com/zhangboblogs/p/7901009.html
Copyright © 2011-2022 走看看