学python(7)-- 制作简易计算器

利用近期所学的知识点,制作一个简单的计算器,可以实现四则运算,相反数,开方,平方,倒数,局部清除,全部清除以及消除最后一位数这些简单的基本功能。主要使用了tkinter模块和math模块。

面向过程

#导入需要用到的模块
import tkinter
import math
#创建一个主界面
root = tkinter.Tk()
root.title('计算器')
root['bg'] = '#cadddb'
root.minsize(270, 300)
root.resizable(False, False)


# 定义一个变量,确定是否按下运算符号
ispresign = False
# 定义一个变量,储存输入的数字
numlist = []
#定义一个记录是否按了等于号的变量
isequalsign = 0
#定义一个变量记录是否按下了特殊符号的变量
specialsign = 0

# 按下数字的函数
def pressnum(num):
    #全局化变量
    global ispresign
    global isequalsign
    #判断是否按下了运算符号
    if ispresign == True:
        #如果按下了符号,将面板数字重置为 0
        value1.set('0')
        #将按下运算符号的标志重置
        ispresign = False
    #判断是否按下了等于号
    if isequalsign == 1:
        value1.set('0')
        isequalsign = 0
    # 获得面板上的数字
    oldnum = value1.get()
    #判断按下的  . 点)是否在已有数据中
    if num == '.' and num in oldnum:
        res = oldnum
    #判断按下点的时候原有数据是否为0
    elif num == '.' and oldnum == '0':
        res = oldnum + '.'
    # 如果面板上的数字是0,则把第一个数字储存起来
    elif oldnum == '0':
        res = num
    # 如果不是0,则和之前的数字链接起来,给变量value1
    else:
        res = oldnum + num
    value1.set(res)


# 按下运算符号的函数()
def presign(sign):
    # 全局化变量
    global numlist
    global ispresign
    #判断之前是否已经按过运算符号
    if ispresign == True:#True  表示上一次按过运算符号
        numlist[-1] = sign  # 把第二次按的运算符号替换成上次的运算符号
    else:
        # 获得面板上的数字
        oldnum = value1.get()
        #先将面板上的数字储存到列表中
        numlist.append(oldnum)
        #再将按下的符号储存到列表
        numlist.append(sign)
    #按下符号,会将按下符号标志的状态记录下来
    ispresign = True

#按下特殊符号的按钮(1/x,开方,平方,绝对值,C清空所有,CE清空当前,消除最后一位,)
def special(sign):
    #全局化特殊符号变量
    global specialsign
    #全局化列表
    global numlist
    #获得当前面板上的内容
    strs = value1.get()
    if sign == '1/x':
        #当面板上数字不为0 时
        if strs != '0':
            #进行字符串拼接,并使用eval函数
            res = eval('1/' + strs)
        else:
            res = 0
    elif sign == '√':
        #判断需要开方的数是否是正数
        if eval(strs) > 0:
            #将计算之后的结果显示在面板上
            res = math.sqrt(eval(strs))
        else:
            res = strs
    elif sign == 'm2':
        res = eval(strs + '*'+ strs)
    elif sign == '+/-':
        res = eval('-'+strs)
    elif sign == 'C':
        #直接清空列表
        numlist.clear()
        #将面板上的置为0
        res = 0
    elif sign == 'CE':
        #将当前面板数字置为0 ,保留列表上次储存的数字
        res = 0
    elif sign == '←':
        #判断面板上数字是否为0
        if strs != '0':
            #判断面板上数字是否就一位数
            if len(strs) != 1 :
                # 进行切片操作
                res = strs[0:-1]
            else :
                #如果就一位数字直接变为0
                res = '0'
        else:
            # 若等于0 则不进行操作
            res = '0'
    #将是否按下特殊符号的标志置为  已按(用1 表示)
    specialsign = 1
    #将上面处理的数字放到面板中
    value1.set(res)

# 计算结果
def presseq(signeq):
    #全局化变量
    global numlist
    global isequalsign
    # 获得面板上数字
    oldnum = value1.get()
    #将获得的数字添加到列表中
    numlist.append(oldnum)
    # 将列表中的字符串连接成字符串
    result = ''.join(numlist)
    # 将连接的字符串进行运算
    value1.set(eval(result))
    # 清空列表
    numlist.clear()
    #将是否按下等号的标志置为 已按 (用1 表示)
    isequalsign = 1
#点击介绍触发的函数
def demo1():
    pass

# 设置总菜单
allmenu = tkinter.Menu()
# 添加子菜单
file = tkinter.Menu(tearoff=0)
# 向子菜单添加选项卡
file.add_command(label='介绍', command=demo1)
file.add_command(label='退出', command=root.quit)

# 设置显示区域的值
value1 = tkinter.StringVar()
value1.set('0')
# 显示区域
show = tkinter.Label(textvariable=value1, anchor='e', bg='white', font=('宋体', 15), bd=10)
show.place(x=10, y=10, width=245, height=60)

# 数字按钮
btn0 = tkinter.Button(text='0', command=lambda: pressnum('0'))
btn0.place(x=10, y=250, width=95, height=40)

btndian = tkinter.Button(text='.',command=lambda: pressnum('.'))
btndian.place(x=110, y=250, width=45, height=40)

btn1 = tkinter.Button(text='1', command=lambda: pressnum('1'))
btn1.place(x=10, y=205, width=45, height=40)

btn2 = tkinter.Button(text='2', command=lambda: pressnum('2'))
btn2.place(x=60, y=205, width=45, height=40)

btn3 = tkinter.Button(text='3', command=lambda: pressnum('3'))
btn3.place(x=110, y=205, width=45, height=40)

btn4 = tkinter.Button(text='4', command=lambda: pressnum('4'))
btn4.place(x=10, y=160, width=45, height=40)

btn5 = tkinter.Button(text='5', command=lambda: pressnum('5'))
btn5.place(x=60, y=160, width=45, height=40)

btn6 = tkinter.Button(text='6', command=lambda: pressnum('6'))
btn6.place(x=110, y=160, width=45, height=40)

btn7 = tkinter.Button(text='7', command=lambda: pressnum('7'))
btn7.place(x=10, y=115, width=45, height=40)

btn8 = tkinter.Button(text='8', command=lambda: pressnum('8'))
btn8.place(x=60, y=115, width=45, height=40)

btn9 = tkinter.Button(text='9', command=lambda: pressnum('9'))
btn9.place(x=110, y=115, width=45, height=40)

# 四则运算符号按钮
btnjia = tkinter.Button(text='+', command=lambda: presign('+'))
btnjia.place(x=160, y=250, width=45, height=40)

btnjian = tkinter.Button(text='-', command=lambda: presign('-'))
btnjian.place(x=160, y=205, width=45, height=40)

btncheng = tkinter.Button(text='X', command=lambda: presign('*'))
btncheng.place(x=160, y=160, width=45, height=40)

btnchu = tkinter.Button(text='÷', command=lambda: presign('/'))
btnchu.place(x=160, y=115, width=45, height=40)

#特殊运算符号
btndaoshu = tkinter.Button(text='1/x',command = lambda :special('1/x'))
btndaoshu.place(x=10, y=75, width=45, height=35)

btngenhao = tkinter.Button(text='√',command = lambda :special('√'))
btngenhao.place(x=60, y=75, width=45, height=35)

btnsqrt = tkinter.Button(text='㎡',command = lambda :special('m2'))
btnsqrt.place(x=110, y=75, width=45, height=35)

btnsqrt = tkinter.Button(text='+/-',command = lambda :special('+/-'))
btnsqrt.place(x=160, y=75, width=45, height=35)

btnsqrt = tkinter.Button(text='C',command = lambda :special('C'))
btnsqrt.place(x=210, y=75, width=45, height=35)

btndel = tkinter.Button(text='←',command = lambda :special('←'))
btndel.place(x=210, y=160, width=45, height=40)

btnclear = tkinter.Button(text='CE',command = lambda :special('CE'))
btnclear.place(x=210, y=115, width=45, height=40)

btnden = tkinter.Button(text='=', command=lambda: presseq('='))
btnden.place(x=210, y=205, width=45, height=85)
# 将子菜单加入总菜单
allmenu.add_cascade(menu=file, label='文件')


root.config(menu=allmenu)
root.mainloop()

面向对象

import tkinter
import math

class jisuan:
    def __init__(self):
        #初始化主界面
        self.root = tkinter.Tk()
        self.root.title('计算器')
        self.root['bg'] = '#cadddb'
        self.root.minsize(270, 300)
        self.root.resizable(False, False)

        # 设置显示区域的值
        self.value1 = tkinter.StringVar()
        self.value1.set('0')

        # 定义一个变量,确定是否按下运算符号
        self.ispresign = False
        # 定义一个变量,储存输入的数字
        self.numlist = []
        # 定义一个记录是否按了等于号的变量
        self.isequalsign = 0
        # 定义一个变量记录是否按下了特殊符号的变量
        self.specialsign = 0

        #调用界面布局的方法
        self.show()

        self.root.mainloop()
    #界面的布局方法
    def show(self):

        # 设置总菜单
        self.allmenu = tkinter.Menu()
        # 添加子菜单
        self.file = tkinter.Menu(tearoff=0)
        # 向子菜单添加选项卡
        self.file.add_command(label='介绍',command = self.introduce)
        self.file.add_command(label='退出', command=self.root.quit)
        # 将子菜单加入总菜单
        self.allmenu.add_cascade(menu=self.file, label='文件')
        self.root.config(menu=self.allmenu)

        # 显示区域
        show = tkinter.Label(textvariable=self.value1, anchor='e', bg='white', font=('宋体', 15), bd=10)
        show.place(x=10, y=10, width=245, height=60)

        # 数字按钮
        btn0 = tkinter.Button(text='0', command=lambda: self.pressnum('0'))
        btn0.place(x=10, y=250, width=95, height=40)

        btndian = tkinter.Button(text='.', command=lambda: self.pressnum('.'))
        btndian.place(x=110, y=250, width=45, height=40)

        btn1 = tkinter.Button(text='1', command=lambda: self.pressnum('1'))
        btn1.place(x=10, y=205, width=45, height=40)

        btn2 = tkinter.Button(text='2', command=lambda: self.pressnum('2'))
        btn2.place(x=60, y=205, width=45, height=40)

        btn3 = tkinter.Button(text='3', command=lambda: self.pressnum('3'))
        btn3.place(x=110, y=205, width=45, height=40)

        btn4 = tkinter.Button(text='4', command=lambda: self.pressnum('4'))
        btn4.place(x=10, y=160, width=45, height=40)

        btn5 = tkinter.Button(text='5', command=lambda: self.pressnum('5'))
        btn5.place(x=60, y=160, width=45, height=40)

        btn6 = tkinter.Button(text='6', command=lambda: self.pressnum('6'))
        btn6.place(x=110, y=160, width=45, height=40)

        btn7 = tkinter.Button(text='7', command=lambda: self.pressnum('7'))
        btn7.place(x=10, y=115, width=45, height=40)

        btn8 = tkinter.Button(text='8', command=lambda: self.pressnum('8'))
        btn8.place(x=60, y=115, width=45, height=40)

        btn9 = tkinter.Button(text='9', command=lambda: self.pressnum('9'))
        btn9.place(x=110, y=115, width=45, height=40)

        # 四则运算符号按钮
        btnjia = tkinter.Button(text='+', command=lambda: self.presign('+'))
        btnjia.place(x=160, y=250, width=45, height=40)

        btnjian = tkinter.Button(text='-', command=lambda: self.presign('-'))
        btnjian.place(x=160, y=205, width=45, height=40)

        btncheng = tkinter.Button(text='X', command=lambda: self.presign('*'))
        btncheng.place(x=160, y=160, width=45, height=40)

        btnchu = tkinter.Button(text='÷', command=lambda: self.presign('/'))
        btnchu.place(x=160, y=115, width=45, height=40)

        # 特殊运算符号
        btndaoshu = tkinter.Button(text='1/x', command=lambda: self.special('1/x'))
        btndaoshu.place(x=10, y=75, width=45, height=35)

        btngenhao = tkinter.Button(text='√', command=lambda: self.special('√'))
        btngenhao.place(x=60, y=75, width=45, height=35)

        btnsqrt = tkinter.Button(text='㎡', command=lambda: self.special('m2'))
        btnsqrt.place(x=110, y=75, width=45, height=35)

        btnsqrt = tkinter.Button(text='+/-', command=lambda: self.special('+/-'))
        btnsqrt.place(x=160, y=75, width=45, height=35)

        btnsqrt = tkinter.Button(text='C', command=lambda: self.special('C'))
        btnsqrt.place(x=210, y=75, width=45, height=35)

        btndel = tkinter.Button(text='←', command=lambda: self.special('←'))
        btndel.place(x=210, y=160, width=45, height=40)

        btnclear = tkinter.Button(text='CE', command=lambda: self.special('CE'))
        btnclear.place(x=210, y=115, width=45, height=40)

        btnden = tkinter.Button(text='=', command=lambda: self.presseq('='))
        btnden.place(x=210, y=205, width=45, height=85)

    def introduce(self):
        #创建一个新的主界面
        self.newroot = tkinter.Toplevel(relief='sunken', bd=10)
        # 设置标题
        self.newroot.title('说明文档')
        # 设置最小宽高
        self.newroot.minsize(350, 300)
        # 设置最大宽高
        self.newroot.maxsize(600, 600)
        # 设置是否允许调整大小
        self.newroot.resizable(False, False)

        # 隐藏窗口,删除图标
        btn = tkinter.Button(self.newroot,bg = 'white',justify = 'left',anchor = 'nw',state = 'disabled' ,font= ('楷体',15),text='这是一个计算器\n是我学python做的第一个小项目\n可以实现和win7相似的基本运算功能\n其中有加减乘除,开方,平方,倒数,\n相反数以及清除当前数字和清除所有\n感谢使用!')
        btn.place(width = 350,height = 300)

    # 按下数字的函数
    def pressnum(self,num):
        # 判断是否按下了运算符号
        if self.ispresign == True:
            # 如果按下了符号,将面板数字重置为 0
            self.value1.set('0')
            # 将按下运算符号的标志重置
            self.ispresign = False
        # 判断是否按下了等于号
        if self.isequalsign == 1:
            self.value1.set('0')
            self.isequalsign = 0
        if self.specialsign == 1:
            self.value1.set('0')
            self.specialsign = 0
        # 获得面板上的数字
        oldnum = self.value1.get()
        # 判断面板上的是否为指定的数据
        if oldnum == '除数不能为0':
            return
        else:
            # 判断按下的  . 点)是否在已有数据中
            if num == '.' and num in oldnum:
                res = oldnum
            # 判断按下点的时候原有数据是否为0
            elif num == '.' and oldnum == '0':
                res = oldnum + '.'
            # 如果面板上的数字是0,则把第一个数字储存起来
            elif oldnum == '0':
                res = num
            # 如果不是0,则和之前的数字链接起来,给变量self.value1
            else:
                res = oldnum + num
            self.value1.set(res)

    # 按下运算符号的函数()
    def presign(self,sign):
        # 判断之前是否已经按过运算符号
        if self.ispresign == True and self.numlist != []:  # True  表示上一次按过运算符号
            self.numlist[-1] = sign  # 把第二次按的运算符号替换成上次的运算符号
        else:
            # 获得面板上的数字
            oldnum = self.value1.get()
            if oldnum == '除数不能为0':
                self.value1.set('除数不能为0')
            else:
                # 先将面板上的数字储存到列表中
                self.numlist.append(oldnum)
                # 再将按下的符号储存到列表
                self.numlist.append(sign)
        # 按下符号,会将按下符号标志的状态记录下来
        self.ispresign = True

    # 按下特殊符号的按钮(1/x,开方,平方,绝对值,C清空所有,CE清空当前,消除最后一位,)
    def special(self,sign):
        # 获得当前面板上的内容
        strs = self.value1.get()
        if sign == '1/x':
            if strs != '除数不能为0':
                # 当面板上数字不为0 时
                if eval(strs) != 0:
                    # 进行字符串拼接,并使用eval函数
                    res = eval('1/' + strs)
                else:
                    res = strs
            else:
                res = strs
        elif sign == '√':
            if strs != '除数不能为0':
                # 判断需要开方的数是否是正数
                if eval(strs) > 0:
                    # 将计算之后的结果显示在面板上
                    res = math.sqrt(eval(strs))
                else:
                    res = strs
            else:
                res = strs
        elif sign == 'm2':
            if strs != '除数不能为0':
                res = eval(strs + '*' + strs)
            else:
                res = strs
        elif sign == '+/-':
            if strs != '除数不能为0':
                if eval(strs) != 0:
                    res = eval('-' + strs)
                else:
                    res = strs
            else:
                res = strs
        elif sign == 'C':
            # 直接清空列表
            self.numlist.clear()
            # 将面板上的置为0
            res = 0
        elif sign == 'CE':
            # 将当前面板数字置为0 ,保留列表上次储存的数字
            res = 0
        elif sign == '←':
            if strs != '除数不能为0':
                # 判断面板上数字是否为0
                if strs != '0':
                    # 判断面板上数字是否就一位数
                    if len(strs) != 1:
                        # 进行切片操作
                        res = strs[0:-1]
                    else:
                        # 如果就一位数字直接变为0
                        res = '0'
                    if self.isequalsign == 1:
                        res = strs
                else:
                    # 若等于0 则不进行操作
                    res = '0'
            else:
                res = strs

        # 将是否按下特殊符号的标志置为  已按(用1 表示)
        self.specialsign = 1
        # 将上面处理的数字放到面板中
        self.value1.set(res)

    # 计算结果
    def presseq(self,signeq):
        # 获得面板上数字
        oldnum = self.value1.get()
        if self.isequalsign == 1:
            self.value1.set(oldnum)
            self.isequalsign = 0
        elif self.specialsign == 1:
            self.value1.set(oldnum)
            self.specialsign = 0
        elif self.numlist == []:
            self.value1.set(oldnum)
        else:
            if oldnum == '除数不能为0':
                self.value1.set(oldnum)
            else:
                # 判断进行除法操作的时候,除数是否为0
                if self.numlist[-1] == '/' and eval(oldnum) == 0:
                    self.value1.set('除数不能为0')
                    self.numlist.clear()
                else:
                    # 将获得的数字添加到列表中
                    self.numlist.append(oldnum)
                    # 将列表中的字符串连接成字符串
                    result = ''.join(self.numlist)
                    # 将连接的字符串进行运算
                    self.value1.set(eval(result))
                    # 清空列表
                    self.numlist.clear()
            # 将是否按下等号的标志置为 已按 (用1 表示)
        self.isequalsign = 1

js = jisuan()

学python(7)-- 制作简易计算器_第1张图片

你可能感兴趣的:(学python(7)-- 制作简易计算器)