大计简易计算器实现

简易计算器实现(python)

from tkinter import *
root=Tk()
root.title('简易计算器')
formula=StringVar()
formula.set('0')
entry=Entry(root,textvariable=formula,bg='skyblue').pack(side=TOP)


def CE(f):						定义'CE'运算符每次删除一个完整数字
    s=f.get()
    sign=['/','*','-','+']
    for i in range(1,len(s)+1):
        if s[-i] in sign:     #字符串也可索引
            s=list(s)
            if i != 1:
                s[-i+1:] = ''     #字符串不可赋值改动
                f.set(''.join(s))
            else:
                f.set(''.join(s))
            return


def XFS(f,k):                         #定义'+/-'运算符实现取相反数
    s=f.get()
    sign=['+','-','*','/']
    for i in range(1 ,len(s)+1):
        if s[-i] == '+':
            s=list(s)
            s[-i] = '-'
            f.set(''.join(s))
            return
        if s[-i] == '-':
            s=list(s)
            s[-i] = '+'
            f.set(''.join(s))
            if s[0] == '+':
                s[0]=''
                f.set(''.join(s))
            return
        if s[-i] == '/' or s[-i] == '*':
            s=list(s)
            s.insert(-i+1,'-')
            f.set(''.join(s))
            return
    s=list(s)
    s.insert(0,'-')
    f.set(''.join(s))


def add(f,k):   #数字和运算符号统一处理
    s=f.get()
    sign=['+','-','*','/']
    digit=['%d'%i for i in range(10)]
    if k in digit:
        if s == '0':    #初始化0转其他数字
            f.set(k)
        elif len(s)>=2:    #当len>=2时才会出现除以0和0k的情况
            if s[-1] == '/' and k == '0':       #规避除以0直接停止添加
                f.set(s)    
            elif (s[-2] in sign) and s[-1] == '0':#规避0k  去掉结尾的0再加上k
                f.set(s[:-1]+k)   #字符串可以切片
            else:
                f.set(f.get()+k)
        else:
            f.set(f.get()+k)
    else:
        if s[-1] not in sign:           
            f.set(f.get()+k)
        elif s[-1] in sign:  #规避运算符号相连 
            f.set(s[:-1]+k)


btnnames=[['CE','C','DEL','/'],
            ['7','8','9','*'],
            ['4','5','6','-'],
            ['1','2','3','+'],
            ['+/-','0','.','=']]
for line in btnnames:
    lineframes=Frame(root)
    for key in line:
        if key in ['%d'%i for i in range(0,10)]:
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:add(f,k)).pack(side=LEFT)
        if key == 'C':
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:f.set('')).pack(side=LEFT)
        if key in ['/','*','-','+']:
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:add(f,k)).pack(side=LEFT)
        if key == '.':
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:f.set(f.get()+k)).pack(side=LEFT)
        if key == 'DEL':
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:f.set(f.get()[:-1])).pack(side=LEFT)
        if key == 'CE':
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:CE(f)).pack(side=LEFT)
        if key == '+/-':
             btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:XFS(f,k)).pack(side=LEFT)
        if key == '=':
            btn=Button(lineframes,text=key,width=4,bg='lightblue',
                       font=('Verdana',16),command=lambda f=formula,\
                       k=key:f.set(eval(f.get()))).pack(side=LEFT)
    lineframes.pack(side=TOP)
mainloop()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值