目的

掌握Tkinter基本图形设计及数据运算

实现

代码

  import tkinter  # 导入tkinter模块
  
  root = tkinter.Tk()
  root.geometry('480x730')
  root.title('Davis_计算器')
  root.resizable(False, False)
  
  # 1.界面布局
  # 显示面板
  result = tkinter.StringVar()
  result.set(0)  # 显示面板显示结果1,用于显示默认数字0
  result2 = tkinter.StringVar()  # 显示面板显示结果2,用于显示计算过程
  result2.set('')
  # 显示版
  label = tkinter.Label(root, font=('Arial', 20), bg='lightblue', bd='9', fg='#828282', anchor='se', textvariable=result2)
  label.place(width=480, height=170)
  label2 = tkinter.Label(root, font=('Arial', 30), bg='lightblue', bd='9', fg='black', anchor='se', textvariable=result)
  label2.place(y=170, width=480, height=60)
  
  # 数字键按钮
  
  btn7 = tkinter.Button(root, text='7', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('7'))
  btn7.place(x=0, y=330, width=120, height=100)
  btn8 = tkinter.Button(root, text='8', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('8'))
  btn8.place(x=120, y=330, width=120, height=100)
  btn9 = tkinter.Button(root, text='9', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('9'))
  btn9.place(x=240, y=330, width=120, height=100)
  
  btn4 = tkinter.Button(root, text='4', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('4'))
  btn4.place(x=0, y=430, width=120, height=100)
  btn5 = tkinter.Button(root, text='5', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('5'))
  btn5.place(x=120, y=430, width=120, height=100)
  btn6 = tkinter.Button(root, text='6', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('6'))
  btn6.place(x=240, y=430, width=120, height=100)
  
  btn1 = tkinter.Button(root, text='1', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('1'))
  btn1.place(x=0, y=530, width=120, height=100)
  btn2 = tkinter.Button(root, text='2', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('2'))
  btn2.place(x=120, y=530, width=120, height=100)
  btn3 = tkinter.Button(root, text='3', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('3'))
  btn3.place(x=240, y=530, width=120, height=100)
  btn0 = tkinter.Button(root, text='0', font=('Arial', 20), fg=('#4F4F4F'), bd=10, command=lambda: pressNum('0'))
  btn0.place(x=120, y=630, width=120, height=100)
  
  # 运算符号按钮
  btnac = tkinter.Button(root, text='AC', bd=10, font=('黑体', 20), fg='blue', command=lambda: pressCompute('AC'))
  btnac.place(x=0, y=230, width=120, height=100)
  btnback = tkinter.Button(root, text='←', font=('Arial', 20), fg='blue', bd=10, command=lambda: pressCompute('b'))
  btnback.place(x=120, y=230, width=120, height=100)
  btndivi = tkinter.Button(root, text='÷', font=('Arial', 20), fg='blue', bd=10, command=lambda: pressCompute('/'))
  btndivi.place(x=240, y=230, width=120, height=100)
  btnmul = tkinter.Button(root, text='×', font=('Arial', 20), fg="blue", bd=10, command=lambda: pressCompute('*'))
  btnmul.place(x=360, y=230, width=120, height=100)
  btnsub = tkinter.Button(root, text='-', font=('Arial', 20), fg=('blue'), bd=10, command=lambda: pressCompute('-'))
  btnsub.place(x=360, y=330, width=120, height=100)
  btnadd = tkinter.Button(root, text='+', font=('Arial', 20), fg=('blue'), bd=10, command=lambda: pressCompute('+'))
  btnadd.place(x=360, y=430, width=120, height=100)
  btnequ = tkinter.Button(root, text='=', bg='lightblue', font=('Arial', 20), fg=('#4F4F4F'), bd=10,
                          command=lambda: pressEqual())
  btnequ.place(x=360, y=530, width=120, height=200)
  btnper = tkinter.Button(root, text='%', font=('Arial', 20), fg=('blue'), bd=10, command=lambda: pressCompute('%'))
  btnper.place(x=0, y=630, width=120, height=100)
  btnpoint = tkinter.Button(root, text='.', font=('Arial', 20), fg=('blue'), bd=10, command=lambda: pressCompute('.'))
  btnpoint.place(x=240, y=630, width=120, height=100)
  
  # 操作函数
  lists = []  # 设置一个变量 保存运算数字和符号的列表
  isPressSign = False  # 添加一个判断是否按下运算符号的标志,假设默认没有按下按钮
  isPressNum = False
  
  
  # 数字函数
  def pressNum(num):  # 设置一个数字函数 判断是否按下数字 并获取数字将数字写在显示版上
      global lists  # 全局化lists和按钮状态isPressSign
      global isPressSign
      if isPressSign == False:
          pass
      else:  # 重新将运算符号状态设置为否
          result.set(0)
          isPressSign = False
  
      # 判断界面的数字是否为0
      oldnum = result.get()  # 第一步
      if oldnum == '0':  # 如过界面上数字为0 则获取按下的数字
          result.set(num)
      else:  # 如果界面上的而数字不是0  则链接上新按下的数字
          newnum = oldnum + num
          result.set(newnum)  # 将按下的数字写到面板中
  
  
  # 运算函数
  def pressCompute(sign):
      global lists
      global isPressSign
      num = result.get()  # 获取界面数字
      lists.append(num)  # 保存界面获取的数字到列表中
  
      lists.append(sign)  # 讲按下的运算符号保存到列表中
      isPressSign = True
  
      if sign == 'AC':  # 如果按下的是'AC'按键,则清空列表内容,讲屏幕上的数字键设置为默认数字0
          lists.clear()
          result.set(0)
      if sign == 'b':  # 如果按下的是退格‘’,则选取当前数字第一位到倒数第二位
          a = num[0:-1]
          lists.clear()
          result.set(a)
  
  
  # 获取运算结果函数
  def pressEqual():
      global lists
      global isPressSign
  
      curnum = result.get()  # 设置当前数字变量,并获取添加到列表
      lists.append(curnum)
  
      computrStr = ''.join(lists)  # 讲列表内容用join命令将字符串链接起来
      endNum = eval(computrStr)  # 用eval命令运算字符串中的内容
      #    a = str(endNum)
      #   b = '='+a                       #给运算结果前添加一个 ‘=’ 显示   不过这样写会有BUG 不能连续运算,这里注释,不要 =
      #   c = b[0:10]                     #所有的运算结果取9位数
      result.set(endNum)  # 讲运算结果显示到屏幕1
      result2.set(computrStr)  # 将运算过程显示到屏幕2
      lists.clear()  # 清空列表内容
  
  
  root.mainloop()