python GUI模拟实现计算器


Posted in Python onJune 22, 2020

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简单猜数游戏实例
Jul 09 Python
Django在win10下的安装并创建工程
Nov 20 Python
浅析Git版本控制器使用
Dec 10 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
使用python实现kNN分类算法
Oct 16 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
python实现连连看游戏
Feb 14 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
python利用tkinter实现图片格式转换的示例
Sep 28 Python
python基于opencv 实现图像时钟
Jan 04 Python
keras CNN卷积核可视化,热度图教程
Jun 22 #Python
python实现斗地主分牌洗牌
Jun 22 #Python
解决Keras使用GPU资源耗尽的问题
Jun 22 #Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 #Python
Python 基于jwt实现认证机制流程解析
Jun 22 #Python
python中format函数如何使用
Jun 22 #Python
Tensorflow与Keras自适应使用显存方式
Jun 22 #Python
You might like
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php include加载文件两种方式效率比较
2010/08/08 PHP
php关联数组快速排序的方法
2015/04/17 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
jQuery的基本概念与高级编程
2015/05/14 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
python概率计算器实例分析
2015/03/25 Python
Python扩展内置类型详解
2018/03/26 Python
学习python分支结构
2019/05/17 Python
Ubuntu18.04下python版本完美切换的解决方法
2019/06/14 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
皮肤科医师岗位职责
2013/12/04 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
中英文求职信范文
2015/03/19 职场文书
赢在中国观后感
2015/06/02 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
文明礼貌主题班会
2015/08/14 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
学习nginx基础知识
2021/09/04 Servers
Python制作春联的示例代码
2022/01/22 Python