美文网首页
python GUI模拟实现计算器

python GUI模拟实现计算器

作者: 乐观的程序员 | 来源:发表于2020-11-04 19:35 被阅读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()

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

    相关文章

      网友评论

          本文标题:python GUI模拟实现计算器

          本文链接:https://www.haomeiwen.com/subject/cksgvktx.html