gdmao002 发表于 2020-9-7 23:56:43

简易计算器,tkinter练手未优化

本帖最后由 gdmao002 于 2020-11-25 09:20 编辑

https://s1.ax1x.com/2020/09/07/wKsOeK.jpg
以下是练手的简单计算器,未经过优化。写的不好海涵{:5_109:}

import tkinter
import re


def del_zero(*args):
    global num
    c()
    r = re.match(r"(\d+\.?\d*)([/*+-]{0,2})(\d*?\.?\d*)(=?)$", num)
    if r:
      if r.group(1) != '':# 第1个单元有值2个字符00-09判断
            if len(num) == 2:
                if len(r.group(1)) == 2:
                  if r.group(1) == '0' and r.group(1).isdigit():
                        num = r.group(1)
      if r.group(2) != '':# 第2个单元满足不为空的时候
            if '.' == r.group(1)[-1]:# 判断第1个单元如果有1'.'在后的处理
                num = num[:-1]
            elif len(r.group(1)) >= 3:# 判断第1个单元如果有1'.'在中间 对于多'0'处理
                if r.group(1) == '0' and r.group(1) == '.':
                  # 处理.后一堆0 # 剩余的0个数
                  for i in range(2, len(r.group(1))):
                        if r.group(1) != '0':
                            break
                  else:
                        num = '0' + r.group(2)
            if len(r.group(2)) == 2:# 判断运算符号个数
                num = r.group(1) + r.group(2)[-1]
      if r.group(3) != '':# 判断第3个单元不为空的输入
            if len(r.group(3)) == 1:# 第3个单元有值2个字符00-09判断
                if not r.group(3).isdigit():
                  num = num[:-1]
            elif len(r.group(3)) == 2:
                if r.group(3) == '0' and r.group(3).isdigit():
                  num = r.group(1) + r.group(2) + r.group(3)
            elif len(r.group(3)) >= 3:
                if r.group(3)[-1] == '.' and r.group(3)[-2] == '.':# 处理第三单元.的个数
                  num = num[:-1]
      if r.group(4) == '=':# 第4个单元为'='时
            if r.group(3) != '':
                if r.group(3)[-1] == '.':# 判断第3个单元.在最后的处理
                  num = num[:-1]
                elif len(r.group(3)) >= 3:# 判断第3个单元如果出现0.00000这类的处理
                  if r.group(3) == '0' and r.group(3) == '.':
                        for i in range(2, len(r.group(3))):# 处理.后一堆0 # 剩余的0个数
                            if r.group(3) != '0':
                              break
                        else:
                            num = r.group(1) + r.group(2) + '0'
                if r.group(2) != '' and r.group(3)[-1].isdigit():# 如果=号左边为数字 开始结算
                  cal_1()
            else:
                num = num[:-1]# 第3单元空 第2单元空
      v.set(num)
    else:
      num = num[:-1]
      v.set(num)


def fun0():
    global num
    c()
    num += '0'
    del_zero()


def fun1():
    global num
    c()
    num += '1'
    del_zero()


def fun2():
    global num
    c()
    num += '2'
    del_zero()


def fun3():
    global num
    c()
    num += '3'
    del_zero()


def fun4():
    global num
    c()
    num += '4'
    del_zero()


def fun5():
    global num
    c()
    num += '5'
    del_zero()


def fun6():
    global num
    c()
    num += '6'
    del_zero()


def fun7():
    global num
    c()
    num += '7'
    del_zero()


def fun8():
    global num
    c()
    num += '8'
    del_zero()


def fun9():
    global num
    c()
    num += '9'
    del_zero()


def fun():
    global num
    c()
    num += '.'
    del_zero()


def fun_add():
    global num
    c()
    num += '+'
    del_zero()


def fun_sub():
    global num
    c()
    num += '-'
    del_zero()


def fun_chen():
    global num
    c()
    num += '*'
    del_zero()


def fun_chu():
    global num
    c()
    num += r'/'
    del_zero()


def fun_del():
    global num
    c()
    if num != '':
      num = num[:-1]
      v.set(num)


def fun_c():
    global num
    c()
    if num != '':
      num = ''
    v.set(num)


def fun_ce():
    global num
    c()
    if num == '':
      v.set(num)
    else:
      r = re.match(r"(\d+\.?\d*)([/*+-]{0,2})(\d*?\.?\d*)(=?)$", num)
      if r:
            if r.group(3) != '':
                num = r.group(1) + r.group(2)
                v.set(num)


# 状态函数 负责清空结算
def c():
    global num, count
    if count == 1:
      num = ''
      count = 0


def cal_1():
    global num, count
    r = re.match(r"(\d+\.?\d*)([/*+-]{0,2})(\d*?\.?\d*)(=?)$", num)
    sum1 = 0
    if '.' in r.group(1):
      x = float(r.group(1))
    else:
      x = int(r.group(1))
    if '.' in r.group(3):
      y = float(r.group(3))
    else:
      y = int(r.group(3))
    if '+' == r.group(2):
      sum1 = x + y
    elif '-' == r.group(2):
      sum1 = x - y
    elif '*' == r.group(2):
      sum1 = x * y
    elif '/' == r.group(2):
      if r.group(3) == '0':
            num = r.group(1) + r.group(2)
            return -1
      else:
            sum1 = x / y
    num += str(sum1)

    count = 1


def cal():
    global num
    num += '='
    del_zero()


def callback(event):
    if event.char == '0':
      fun0()
    elif event.char == '1':
      fun1()
    elif event.char == '2':
      fun2()
    elif event.char == '3':
      fun3()
    elif event.char == '4':
      fun4()
    elif event.char == '5':
      fun5()
    elif event.char == '6':
      fun6()
    elif event.char == '7':
      fun7()
    elif event.char == '8':
      fun8()
    elif event.char == '9':
      fun9()
    elif event.char == '.':
      fun()
    elif event.char == '+':
      fun_add()
    elif event.char == '-':
      fun_sub()
    elif event.char == '*':
      fun_chen()
    elif event.char == r'/':
      fun_chu()
    elif event.char == '\r':
      cal()
    else:
      pass


root = tkinter.Tk()
root.title('简易计算器')
root.resizable(0, 0)

frame2 = tkinter.Frame(root)
frame2.grid(row=0, column=1, padx=5, pady=5)

num = ''
count = 0
v = tkinter.StringVar()
label2 = tkinter.Label(frame2, textvariable=v).grid(row=0, column=1, padx=5, pady=5)

frame1 = tkinter.Frame(root)
frame1.grid(row=1, column=1, padx=5, pady=5)

root.bind('<Key>', callback)
root.focus_set()

tkinter.Button(frame1, text='←', width=4, command=fun_del).grid(row=2, column=0, padx=2, pady=5)
tkinter.Button(frame1, text='C', width=4, command=fun_c).grid(row=2, column=1, padx=2, pady=5)
tkinter.Button(frame1, text='CE', width=4, command=fun_ce).grid(row=2, column=2, padx=2, pady=5)
tkinter.Button(frame1, text='/', width=4, command=fun_chu).grid(row=2, column=3, padx=5, pady=5)
tkinter.Button(frame1, text='7', width=4, command=fun7).grid(row=3, column=0, padx=5, pady=2)
tkinter.Button(frame1, text='8', width=4, command=fun8).grid(row=3, column=1, padx=2, pady=2)
tkinter.Button(frame1, text='9', width=4, command=fun9).grid(row=3, column=2, padx=2, pady=2)
tkinter.Button(frame1, text='*', width=4, command=fun_chen).grid(row=3, column=3, padx=5, pady=2)
tkinter.Button(frame1, text='4', width=4, command=fun4).grid(row=4, column=0, padx=5, pady=2)
tkinter.Button(frame1, text='5', width=4, command=fun5).grid(row=4, column=1, padx=2, pady=2)
tkinter.Button(frame1, text='6', width=4, command=fun6).grid(row=4, column=2, padx=2, pady=2)
tkinter.Button(frame1, text='-', width=4, command=fun_sub).grid(row=4, column=3, padx=5, pady=2)
tkinter.Button(frame1, text='1', width=4, command=fun1).grid(row=5, column=0, padx=5, pady=2)
tkinter.Button(frame1, text='2', width=4, command=fun2).grid(row=5, column=1, padx=2, pady=2)
tkinter.Button(frame1, text='3', width=4, command=fun3).grid(row=5, column=2, padx=2, pady=2)
tkinter.Button(frame1, text='+', width=4, command=fun_add).grid(row=5, column=3, padx=5, pady=2)
tkinter.Button(frame1, text='0', width=4, command=fun0).grid(row=6, column=0, padx=5, pady=5)
tkinter.Button(frame1, text='.', width=4, command=fun).grid(row=6, column=1, padx=2, pady=5)
tkinter.Button(frame1, text='=', width=10, command=cal).grid(row=6, column=2, padx=5, pady=5, columnspan=2)
root.mainloop()

gdmao002 发表于 2020-9-8 00:05:45

如有什么疏漏欢迎指正{:5_105:}

zy88888 发表于 2020-9-8 10:28:35

不错,比我强,写了这么长

tan_81383 发表于 2020-9-8 11:06:00

厉害厉害,能写这么长

叼辣条闯世界 发表于 2020-11-22 15:21:07

所有的r = re.match(r'(\d+\.?\d*)([/*+-]{0,2})(\d*?\.?\d*)(=?), num)好像都漏了一个单引号

gdmao002 发表于 2020-11-25 09:07:14

叼辣条闯世界 发表于 2020-11-22 15:21
所有的r = re.match(r'(\d+\.?\d*)([/*+-]{0,2})(\d*?\.?\d*)(=?), num)好像都漏了一个单引号

奇怪我直接用我的py文件复制过来的,怎么漏了呢。我刚打开了py文件我这里都是好的,那我重新在黏贴一遍吧,感谢你的提醒!

gdmao002 发表于 2020-11-25 09:16:49

gdmao002 发表于 2020-11-25 09:07
奇怪我直接用我的py文件复制过来的,怎么漏了呢。我刚打开了py文件我这里都是好的,那我重新在黏贴一遍吧 ...

奇怪我复制了一遍后 再次发现还是少了单引号!惊了!

gdmao002 发表于 2020-11-25 09:22:13

叼辣条闯世界 发表于 2020-11-22 15:21
所有的r = re.match(r'(\d+\.?\d*)([/*+-]{0,2})(\d*?\.?\d*)(=?), num)好像都漏了一个单引号

我把单引号换双引号就可以复制进来了。现在就可以了,感谢你的提醒!

yywwf2003 发表于 2021-1-31 21:46:48

厉害厉害,能写这么长
页: [1]
查看完整版本: 简易计算器,tkinter练手未优化