python GUI模拟实现计算器

2020-10-08 0 342

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

(1)计算器界面如下:

python GUI模拟实现计算器

(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 python GUI模拟实现计算器 http://www.ox520.com/26207.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务