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()
原文地址:https://www.cnblogs.com/zhangboblogs/p/7901009.html