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解析文件示例
Jan 23 Python
python实现屏保计时器的示例代码
Aug 08 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
python采集微信公众号文章
Dec 20 Python
Python文件读写常见用法总结
Feb 22 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 Python
Python如何对XML 解析
Jun 28 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 Python
Django url 路由匹配过程详解
Jan 22 Python
浅析Python中的随机采样和概率分布
Dec 06 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
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
ReactNative实现Toast的示例
2017/12/31 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python的re模块应用实例
2014/09/26 Python
tensorflow 获取变量&打印权值的实例讲解
2018/06/14 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
python通过cython加密代码
2020/12/11 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
一套SQL笔试题
2016/08/14 面试题
高中毕业生自我鉴定范文
2013/09/26 职场文书
人事部主管岗位职责
2013/12/26 职场文书
骨干教师培训制度
2014/01/13 职场文书
个人授权委托书样本
2014/09/13 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
受资助学生感谢信
2015/01/21 职场文书
承诺书模板大全
2015/05/04 职场文书
在职证明书模板
2015/06/15 职场文书