实现面向对象的计算器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现面向对象的计算器相关的知识,希望对你有一定的参考价值。

#计算器
import tkinter
import math
import tkinter.messagebox
class jsq:
    #页面布局方法
    def __init__(self):
        self.root=tkinter.Tk()
        self.root.minsize(330,440)
        #禁止屏幕变化
        self.root.resizable(width=False,height=False)
        self.root.title("小熊计算器")
        #设置显示面板的变量
        self.result=tkinter.StringVar()
        self.result.set(0)
        #设置一个全局变量  运算数字和符号的列表
        self.lists=[]
        #添加一个是否被按下运算符的标志位
        self.ispresssign=False
        #数字是否按下
        self.numsign=False
        #界面布局
        self.layout()
        self.myfunc()
        self.root.mainloop()

    # 定义操作函数
    def myfunc(self):
        # 创建总菜单
        allmenu = tkinter.Menu(self.root)
        # 添加子菜单
        filemenu = tkinter.Menu(allmenu, tearoff=0)
        # 添加选项卡
        filemenu.add_command(label="●标准型(T)    Alt+1", command=self.myfunc)
        filemenu.add_command(label="科学型(S)     ALt+2", command=self.myfunc)
        filemenu.add_command(label="程序员(P)     Alt+3", command=self.myfunc)
        filemenu.add_command(label="统计信息(A)   Alt+4", command=self.myfunc)
        filemenu.add_separator()
        filemenu.add_command(label="历史记录(Y)   Ctel+H", command=self.myfunc)
        filemenu.add_command(label="数字分组", command=self.myfunc)
        filemenu.add_separator()
        filemenu.add_command(label="●基本(B)      Ctrl+F4", command=self.myfunc)
        filemenu.add_command(label="单位转换(U)   Ctel+U", command=self.myfunc)
        filemenu.add_command(label="日期计算(D)   Ctrl+E", command=self.myfunc)
        filemenu.add_command(label="工作表(W)", command=self.myfunc)

        allmenu.add_cascade(label="查看(V)", menu=filemenu)
        # 添加子菜单
        filemenu = tkinter.Menu(allmenu, tearoff=0)
        filemenu.add_command(label="复制(C)    Ctrl+C", command=self.myfunc)
        filemenu.add_command(label="粘帖(P)    Ctrl+V", command=self.myfunc)
        filemenu.add_separator()
        filemenu.add_command(label="历史记录(H)", command=self.myfunc)
        allmenu.add_cascade(label="编辑(E)", menu=filemenu)
        # 添加子菜单
        filemenu = tkinter.Menu(allmenu, tearoff=0)
        filemenu.add_command(label="查看帮助(V)   F1", command=self.myfunc)
        filemenu.add_separator()
        filemenu.add_command(label="关于计算器(A)", command=self.myfunc)
        allmenu.add_cascade(label="帮助(H)", menu=filemenu)
        # 摆放菜单
        self.root.config(menu=allmenu)

    #界面组件摆放
    def layout(self):
        #显示面板
        show = tkinter.Label(self.root, textvariable=self.result, bg="white", font=("隶书", 28,"bold"), anchor="e",borderwidth=10)
        show.place(x=20, y=20, height=50, width=290)
        #数字及功能键摆放
        btn1 = tkinter.Button(self.root,bd=3, text="MC",command=self.mc)
        btn1.place(x=20, y=80, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="MR",command=self.mr)
        btn1.place(x=80, y=80, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="MS",command=self.ms)
        btn1.place(x=140, y=80, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="M+",command=self.mjia)
        btn1.place(x=200, y=80, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="M-",command=self.mjian)
        btn1.place(x=260, y=80, height=50, width=50)
        #功能键
        btn1 = tkinter.Button(self.root,bd=3, text="←", command=self.delete)
        btn1.place(x=20, y=140, height=50, width=50)
        btn1 = tkinter.Button(self.root, bd=3,text="CE", command=self.clearce)
        btn1.place(x=80, y=140, height=50, width=50)
        btn1 = tkinter.Button(self.root, bd=3,text="C", command=self.clear)
        btn1.place(x=140, y=140, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="±", command=self.zhengfu)
        btn1.place(x=200, y=140, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="√", command=self.sqr)
        btn1.place(x=260, y=140, height=50, width=50)
        # 7~9
        btn1 = tkinter.Button(self.root, bd=3,text="7", command=lambda: self.pressnum("7"))
        btn1.place(x=20, y=200, height=50, width=50)
        btn1 = tkinter.Button(self.root, bd=3,text="8", command=lambda: self.pressnum("8"))
        btn1.place(x=80, y=200, height=50, width=50)
        btn1 = tkinter.Button(self.root, bd=3,text="9", command=lambda: self.pressnum("9"))
        btn1.place(x=140, y=200, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="/", command=lambda: self.presscompute("/"))
        btn1.place(x=200, y=200, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="%", command=lambda: self.presscompute("%"))
        btn1.place(x=260, y=200, height=50, width=50)
        # 4~6
        btn1 = tkinter.Button(self.root, bd=3,text="4", command=lambda: self.pressnum("4"))
        btn1.place(x=20, y=260, height=50, width=50)
        btn1 = tkinter.Button(self.root, bd=3,text="5", command=lambda: self.pressnum("5"))
        btn1.place(x=80, y=260, height=50, width=50)
        btn1 = tkinter.Button(self.root, bd=3,text="6", command=lambda: self.pressnum("6"))
        btn1.place(x=140, y=260, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="*", command=lambda: self.presscompute("*"))
        btn1.place(x=200, y=260, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="1/x", command=self.fenshu)
        btn1.place(x=260, y=260, height=50, width=50)
        # 1~3
        btn1 = tkinter.Button(self.root,bd=3, text="1", command=lambda: self.pressnum("1"))
        btn1.place(x=20, y=320, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="2", command=lambda: self.pressnum("2"))
        btn1.place(x=80, y=320, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="3", command=lambda: self.pressnum("3"))
        btn1.place(x=140, y=320, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="-", command=lambda: self.presscompute("-"))
        btn1.place(x=200, y=320, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="=", command=self.eqal)
        btn1.place(x=260, y=320, height=110, width=50)
        # 0 . +
        btn1 = tkinter.Button(self.root,bd=3, text="0", command=lambda: self.pressnum("0"))
        btn1.place(x=20, y=380, height=50, width=110)
        btn1 = tkinter.Button(self.root,bd=3, text=".", command=lambda: self.pressnum("."))
        btn1.place(x=140, y=380, height=50, width=50)
        btn1 = tkinter.Button(self.root,bd=3, text="+", command=lambda: self.presscompute("+"))
        btn1.place(x=200, y=380, height=50, width=50)
    #数字方法
    def pressnum(self,num):
        #判断是否按下数字
        if self.numsign==True:
            self.result.set("0")
            self.numsign=False
        #判断值是否为0
        if self.result.get()=="0":
            self.result.set(num)
            if num==".":  #如果先按下小数点  前面加0
                self.result.set("0"+num)
        else: #只能有一个小数点
            if self.result.get().count(".")==0:
                #获取当前的值存入变量
                oldnum=self.result.get()
                #将变量中的值和后面输入的值拼接
                self.result.set(oldnum+num)
            elif num !=".":
                # 获取当前的值存入变量
                oldnum = self.result.get()
                # 将变量中的值和后面输入的值拼接
                self.result.set(oldnum + num)
        self.numsign=False
        self.ispresssign=True
    #运算函数
    def presscompute(self,sign):
        if self.ispresssign==True:
            self.lists.append(self.result.get())
            self.lists.append(sign)
        self.ispresssign=False
        self.numsign=True

    #获取运算结果
    def eqal(self):
        self.lists.append(self.result.get())
        computestr="".join(self.lists)
        if "+-*/=" in computestr:
            computestr=computestr[0:-1]
        #eval
        endnum=eval(computestr)
        #将运算结果显示在屏幕上
        self.result.set(endnum)
        #清空列表
        self.lists.clear()
        #判断数字是否按下
        self.numsign=True
        if endnum==float(endnum):
            self.result.set(round(endnum,3))

    #清空操作(C)
    def clear(self):
        self.lists = []
        self.result.set("0")
    # 清空操作(CE)
    def clearce(self):
        self.result.set("0")

    # 删除操作
    def delete(self):
        if self.result.get() == "" or self.result.get == "0":
            self.result.set("0")
            return
        else:
            #返回界面字符串长度
            changdu = len(self.result.get())
            if changdu > 1:
                #在屏幕上获取字符串给变量
                strnum = self.result.get()
                #取片操作
                strnum = strnum[0:changdu - 1]
                self.result.set(strnum)
            else:
                self.result.set("0")
    #正负数操作
    def zhengfu(self):
        strnum = self.result.get()
        #判断一个数是否有负号
        if strnum[0] == "-":
            self.result.set(strnum[1:])
        elif strnum[0] != "-" and strnum != "0":
            self.result.set("-" + strnum)
    # 开平方
    def sqr(self):
        import math
        strnum = float(self.result.get())
        #开平方操作
        endnum = math.sqrt(strnum)
        self.result.set(endnum)

    # 1/x
    def fenshu(self):
        if self.result.get()=="0":
            self.result.set("2B,除数不能为0")
        else:
            strnum = float(self.result.get())
            endnum = 1 / strnum
            self.result.set(endnum)
    #MC
    def mc(self):
        tkinter.messagebox.showinfo(title="MC功能",message="正在努力开发中^_^")
    #MR
    def mr(self):
        tkinter.messagebox.showinfo(title="MR功能", message="正在努力开发中^_^")
    #MS
    def ms(self):
        tkinter.messagebox.showinfo(title="MS功能", message="正在努力开发中^_^")
    #M+
    def mjia(self):
        tkinter.messagebox.showinfo(title="M+功能", message="正在努力开发中^_^")
    #M-
    def mjian(self):
        tkinter.messagebox.showinfo(title="M-功能",message="正在努力开发中^_^")

#实例化对象
ll=jsq()

  

以上是关于实现面向对象的计算器的主要内容,如果未能解决你的问题,请参考以下文章

Java中面向对象的三大特性之封装

Python 面向对象的综合应用

Python简单计算器实现(面向对象)

python之路之前没搞明白4面向对象(封装)

Scala的面向对象与函数编程

利用面向对象写一个计算器