实现面向对象的计算器

#计算器
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()

  

时间: 2024-11-10 13:49:13

实现面向对象的计算器的相关文章

面向对象简易计算器

import tkinterimport mathimport tkinter.messagebox class jsq: #界面布局方法 def __init__(self): #创建界面 self.root = tkinter.Tk() self.root.minsize(280,420) self.root.title('chy计算器') #调用方法 self.showlabel() self.myfunc() self.root.resizable(width = False, heig

《面向对象的计算器》

package com.lewang; import java.util.HashMap;import java.util.Map; abstract class Operator { public final String op; public Operator(String op) { this.op = op; } public double op(String lhs, String rhs) { double a = Double.parseDouble(lhs); double b

asp.net基础学习笔记

原文地址:http://blog.csdn.net/oxoxzhu/article/details/8652530 1.概论 浏览器-服务器 B/S 浏览的 浏览器和服务器之间的交互,形成上网B/S模式 对于HTML传到服务器  交给服务器软件(IIS)  服务器软件直接读取静态页面代码,然后返回浏览器 对于ASPX传达服务器  交给服务器软件(IIS)   IIS发现自己处理不了aspx的文件,就去映射表根据后缀名里找到响应的处理程序(isapi,服务器扩展程序) 问题:IIS如何调用可扩展程

使用面向对象的图形计算器

这个例子可能并不实用,但基本概括了面向对象的三个特征:继承性,封装性,多态性.本例的主要功能有: 让用户可以选择不同类型的图形: 对所选的图形输入其相关属性: 根据输入的属性计算该图形的周长和面积. 效果如下: 思路: A部分直接在index.php中写,点击对应是图形的时候发送一个$_GET["shape"]给自身页面,使用了自动加载类. B部分由form.class.php输出,其中使用了变量函数,用$_GET["shape"]的值调用不同的函数,确定不同图形的

基于对象编程与面向对象编程(表达式计算器3)

基于对象编程与面向对象编程 我们的最终目的是用C++设计一个面向对象的表达式计算器,所以非常有必要弄清楚,什么是基于对象编程和面向对象的编程.而要弄清楚这一点,又要先弄明白什么是值语言,什么是对象语义 值语义:对象的拷贝与原对象无关,拷贝后与原对象脱离关系,互不影响.这种拷贝叫深拷贝.拷贝之后脱离关系,只要在拷贝的时候都为对象分配内存空间就行了.某种些情况下算是一种对资源的浪费 值语义例子 class Test { private: int * pNum_; public: Test(int n

php:兄弟连之面向对象版图形计算器1

曾经看细说PHP的时候就想做这个,可是一直没什么时间,这次总算忙里偷闲搞了代码量比較多的project. 首先,文档结构,都在一个文件夹下就好了,我的就例如以下. 一開始,进入index.php文件. <html> <head> <title>图形计算器(面向对象)</title> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"&

hp:兄弟连之面向对象版图形计算器2

上篇说到通过result.class.php来分流,由于三个类都继承了shape这个类,让我们来看一下,面向对象中的继承. shape.class.shape文件 <?php abstract class shape{ public $shapeName; abstract function area(); abstract function perimeter(); /* * 所有的实体类都要继承shape以便于统一方法和属性 * 验证 validate方法一致 * */ protected

PHP面向对象实例(图形计算器)

效果: index.php <!DOCTYPE html> <html> <head> <title>图形计算(使用面向对象技术开发)</title> <meta http-equiv="content" content="text/html" charset="utf-8" /> </head> <body> <center> <!

面向对象初体验-计算器

先上测试地址 http://lanjianwc.sinaapp.com/ <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport