Python GUI simulation implementation calculator

Python writes a calculator for your reference, the specific content is as follows

(1) The calculator interface is as follows:

2e7a3ada2709bed0633c6ff929bebab2.jpeg


(2) It basically meets all the needs of the calculator. Keyboard input is not allowed when in use, and can only be executed by clicking the left button of the mouse. 0.0 is displayed initially, and the content entered each time is stored in D:\num.txt (created automatically when the program is started)

(3) The "AC" record is cleared and returned to the initial 0.0; "delete" deletes the previous input; "+/-" turns a positive number into a negative number, and a negative number is a positive number

(4) For different hexadecimal value systems, the precise value of decimals is different. Therefore, the computer will have a phenomenon of 0.1+0.2=0.3000000000004, which can truncate the data, which can solve the problem, but the accuracy is lost. (This computer is not truncated)

import tkinter,os 
from tkinter import * 
 
def temp(string):#blank interval 
  temp=tkinter.Frame(string,width=20,height=50) 
  temp.pack() 
 
flag=0 
node=0 
def num_work(): # Update the display box Label 
  global flag 
  global node 
  with open("D:\\num.txt") as f: 
    for length in f: 
      string=length 
  top_work.configure(text=string.strip('\n')) # Re Set the label text 
  root.after(500,num_work) # Call the function num_work itself every 0.5s to get the result 
 
def num_math_int(num1,num2):#Integer operation 
  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:
    all contents of file D:\\num.txt
      #Read
  else:file.write(string)
    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':#Resolve the situation where the end is line break 
        num1=lists[-3] 
         
      #Percentage decimalization 
      # There are more results than 0.0000000001 
      num1=decimal(num1) 
      num2=decimal(num2) 
         
      try: 
        #Judging whether two numbers are integers or decimals 
        number=int(num1) 
        number=int(num2[1:]) num_math_int(num1 ,num2) 
        #Two numbers for integer operations 
      except: num_math_float(num1,num2)#Two numbers for decimal operations
          
    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) 
  if os.path.exists("D:\\num.txt")==False:
   
def run():#The main body of the calculator display interface
   
    with open("D:\\num.txt",'w') as f: 
      f.write('0.0\n') 
       
  global root#Define the global variable root to facilitate Label update 
  root=tkinter.Tk() 
  root. title("Calculator") 
   
  #x = root.winfo_screenwidth() #Get 
  the width of the 
  current screen# 
  y = root.winfo_screenheight() 
  #Get the height of the current screen# print(((x-500)//2),( (y-600)//2))#The parameters provided for the center 
   
  root.geometry('400x500+760+290')#The main body length is 400, the height is 500, and the center is 
  top=tkinter.Frame(root,width=20,height =50) 
  top.pack() 
 
  global top_work#define global variable root 
  temp(top) 
  #blank interval 
  #calculator display box top_work=tkinter.Label(top,text='',justify='left',relief=SUNKEN, bd=10,bg='white',width=40)  
  top_work.pack(side='bottom')#Calculator display box (position at the bottom)
  num_work() 
  temp(root) 
   
  #Blank interval number=tkinter.Frame(root)#Into a container for computer keyboard
  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()


The above is the whole content of this article, I hope it will be helpful to everyone's study, and I hope you can support it.


Guess you like

Origin blog.51cto.com/14825302/2546876