python GUI模拟实现计算器

2020-11-04  本文已影响0人  乐观的程序员

python编写计算器,供大家参考,具体内容如下

(1)计算器界面如下:

(2)基本满足了计算器的所有需求,使用时不可键盘输入,只能鼠标点击左键才可执行。初始时显示0.0,每次输入的内容存于D:\num.txt(启动程序时自动创建)

(3)" AC " 记录清零返回初始 0.0;" delete " 删除上一个输入内容;" +/- " 将正数为负数,负数为正数

(4)对于不同的进制数值系统,小数的精准值不同。

因此计算机会出现 0.1+0.2=0.3000000000004 的现象

能对数据进行截断处理,可以解决问题,但精度丧失。

(此计算机没有进行截断处理)

import tkinter,os

from tkinter import *

def temp(string):#空白间隔

  temp=tkinter.Frame(string,width=20,height=50)

  temp.pack()

flag=0

node=0

def num_work():  #更新显示框Lable

  global flag

  global node

  with open("D:\\num.txt") as f:

    for length in f:

      string=length

  top_work.configure(text=string.strip('\n'))  # 重新设置标签文本

  root.after(500,num_work) # 每隔0.5s调用函数num_work自身获取结果

def num_math_int(num1,num2):#整数运算

  try:

    if num2[0]=='+':

      string=int(num1)+int(num2[1:])

    elif num2[0]=='-':

      string=int(num1)-int(num2[1:])

    elif num2[0]=='x':

      string=int(num1)*int(num2[1:])

    elif num2[0]=='/':

      string=int(num1)/int(num2[1:])

    with open("D:\\num.txt",'a') as f:

      f.write('\n'+str(string)+'\n')

  except:

    with open("D:\\num.txt",'a') as f:

        f.write('\n错误')

def num_math_float(num1,num2):#小数运算

  try:

    if num2[0]=='+':

      string=float(num1)+float(num2[1:])

    elif num2[0]=='-':

      string=float(num1)-float(num2[1:])

    elif num2[0]=='x':

      string=float(num1)*float(num2[1:])

    elif num2[0]=='/':

      string=float(num1)/float(num2[1:])

    if flag==0:

      with open("D:\\num.txt",'a') as f:

        f.write('\n'+str(string)+'\n')

    else:

      with open("D:\\num.txt",'a') as f:

        f.write('\n'+str(string))

  except:

    with open("D:\\num.txt",'a') as f:

        f.write('\n错误')

def decimal(num):

  if num.count('%')>0:

    num=num.replace('%','')

    num=num.replace('\n','')

    if num.isnumeric():

      num=str(float(num)/100)

    else:

      num=num[0]+str(float(num[1:])/100)

  return num

def work(string):#按键对应的功能

  if string.isnumeric():

    with open("D:\\num.txt","a") as file:

      file.write(string)

  else:

    #读取文件D:\\num.txt所有内容

    lists=[]

    with open("D:\\num.txt","r") as file:

      for length in file:

        lists.append(length)

    if string=='AC':

      with open("D:\\num.txt","w") as file:

        file.write('0.0\n')

    elif string=='=':

      num1=lists[-2]

      num2=lists[-1]

      if num1=='\n':#解决末尾为换行的情况

        num1=lists[-3]

      #将百分数小数化

      #出现结果多0.0000000001

      num1=decimal(num1)

      num2=decimal(num2)

      try:      #判断两个数是整数还是小数

        number=int(num1)

        number=int(num2[1:])

        num_math_int(num1,num2)#两个数进行整数运算

      except:

        num_math_float(num1,num2)#两个数进行小数运算

    elif string=='.':

      if lists[-1].count('.')==0:#判断结尾是否有小数点,没有写入否则报错

        with open("D:\\num.txt","a") as file:

          file.write(string)

      else:

        with open("D:\\num.txt","a") as file:

          file.write('\n错误')

    elif string=='+/-':

      if lists[-1].count('-')==0:#-+为-

        if lists[-1].count('+')==1:

          lists[-1]=lists[-1].replace('+','')

        lists[-1]='-'+lists[-1]

      else:          #--为+

        lists[-1]=lists[-1].replace('-','+')

      #更新文件

      with open("D:\\num.txt","w") as file:

        pass

      for length in lists:

        with open("D:\\num.txt","a") as file:

          file.write(length)

    elif string=='delete':

      number=lists[-1]

      lists[-1]=number[0:(len(number)-1)]#删除一位

      #更新文件

      with open("D:\\num.txt","w") as file:

        pass

      for length in lists:

        with open("D:\\num.txt","a") as file:

          file.write(length)

    elif string=='%':

      if lists[-1].endswith("%")==False:

        with open("D:\\num.txt","a") as file:

          file.write(string)

      else:

        with open("D:\\num.txt","a") as file:

          file.write('\n错误')

    else:

      with open("D:\\num.txt","a") as file:

        file.write('\n'+string)

def run():#计算器显示界面主体

  if os.path.exists("D:\\num.txt")==False:

    with open("D:\\num.txt",'w') as f:

      f.write('0.0\n')

  global root#定义全局变量root,方便Label更新

  root=tkinter.Tk()

  root.title("计算器")

  #x = root.winfo_screenwidth()

  #获取当前屏幕的宽

  #y = root.winfo_screenheight()

  #获取当前屏幕的高

  #print(((x-500)//2),((y-600)//2))#为居中提供的参数

  root.geometry('400x500+760+290')#主体长400,高500,居中

  top=tkinter.Frame(root,width=20,height=50)

  top.pack()

  global top_work#定义全局变量root

  temp(top)#空白间隔

  #计算器显示框

  top_work=tkinter.Label(top,text='',justify='left',relief=SUNKEN,bd=10,bg='white',width=40)

  top_work.pack(side='bottom')#计算器显示框(位置居下)

  num_work()

  temp(root)#空白间隔

  number=tkinter.Frame(root)#成放计算机键盘的容器

  number.pack()

  #所有按键,AC键为事例

  numberAC=tkinter.Button(number,text="AC",width=10,command=lambda : work('AC')).grid(row=0,column=0)

  #左键点击,执行函数work

  #按键位置(0,0)

  numberdelete=tkinter.Button(number,text="delete",width=10,command=lambda : work('delete')).grid(row=0,column=1)

  numberzhengfu=tkinter.Button(number,text="+/-",width=10,command=lambda : work('+/-')).grid(row=0,column=2)

  numberchu=tkinter.Button(number,text="/",width=10,command=lambda : work('/')).grid(row=0,column=3)

  tkinter.Button(number,text="7",width=10,command=lambda : work('7')).grid(row=1,column=0)

  tkinter.Button(number,text="8",width=10,command=lambda : work('8')).grid(row=1,column=1)

  tkinter.Button(number,text="9",width=10,command=lambda : work('9')).grid(row=1,column=2)

  tkinter.Button(number,text="x",width=10,command=lambda : work('x')).grid(row=1,column=3)

  tkinter.Button(number,text="4",width=10,command=lambda : work('4')).grid(row=2,column=0)

  tkinter.Button(number,text="5",width=10,command=lambda : work('5')).grid(row=2,column=1)

  tkinter.Button(number,text="6",width=10,command=lambda : work('6')).grid(row=2,column=2)

  tkinter.Button(number,text="-",width=10,command=lambda : work('-')).grid(row=2,column=3)

  tkinter.Button(number,text="1",width=10,command=lambda : work('1')).grid(row=3,column=0)

  tkinter.Button(number,text="2",width=10,command=lambda : work('2')).grid(row=3,column=1)

  tkinter.Button(number,text="3",width=10,command=lambda : work('3')).grid(row=3,column=2)

  tkinter.Button(number,text="+",width=10,command=lambda : work('+')).grid(row=3,column=3)

  tkinter.Button(number,text="%",width=10,command=lambda : work('%')).grid(row=4,column=0)

  tkinter.Button(number,text="0",width=10,command=lambda : work('0')).grid(row=4,column=1)

  tkinter.Button(number,text=".",width=10,command=lambda : work('.')).grid(row=4,column=2)

  tkinter.Button(number,text="=",width=10,command=lambda : work('=')).grid(row=4,column=3)

  root.mainloop()

if __name__=='__main__':

  run()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇下一篇

猜你喜欢

热点阅读