python GUI模拟实现计算器
作者:sea_kingdom 发布时间:2023-01-08 22:20:40
标签:python,GUI,计算器
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()
来源:https://blog.csdn.net/sea_kingdom/article/details/106105374


猜你喜欢
- 1.前言这段时间,金三银四,很多人面试,很多人分享面试题。在前段时间,我也临时担任面试官,为了大概了解面试者的水平,我也写了一份题目,面试了
- tkinter获取复选框(Checkbutton)的值定义GUI:from tkinter import *# 初始化Tk()myWindo
- 本文实例讲述了Python2.7+pytesser实现简单验证码的识别方法。分享给大家供大家参考,具体如下:首先,安装Python2.7版本
- EM算法实例通过实例可以快速了解EM算法的基本思想,具体推导请点文末链接。图a是让我们预热的,图b是EM算法的实例。这是一个抛硬币的例子,H
- iou33449999 文:一个链接 一个层 一个onMouseOver 一个onMouseOut然后这个层就会在onMouseOver这个
- 需求背景在很多时候我们需要抽取视频的某一帧做一些分析或修改等;比如笔者需求就是判断一个人在该视频中出现的频率,以判断他是否是这段视频的主角;
- 背景:文件内容每一行是由N个单一数字组成的,每个数字之间由制表符区分,比如:0 4 3 1 2 2 1 0 3 1 2 0 ……现在需要将每
- 1、在Asp页面首部加入Response.Buffer = True Response.ExpiresAbso
- 字段是Python是字典中唯一的键-值类型,是Python中非常重要的数据结构,因其用哈希的方式存储数据,其复杂度为O(1),速度非常快。下
- 概述一般在开发中,查询网络API操作时往往是比较耗时的,这意味着可能需要一段时间的等待才能获得响应。因此,为了避免程序在请求时无响应的情况,
- 一、弱网简介弱网看字面意思就是网络比较弱,我们通称为信号差,网速慢。1、弱网的影响在地铁、隧道、电梯和车库等场景下使用APP ,网络会出现延
- 因为这两天在学习深度学习需要用到ubuntu+python3.6版本,所以就按照网上的教学安装,但是ubuntu16.04自带的是pytho
- 目录MySQL 基础常用命令1. SQL语句2. 建表3.字段属性4.修改表:alter table5. 增删改查:字符串全部使用'
- 本文实例讲述了Python记录详细调用堆栈日志的方法。分享给大家供大家参考。具体实现方法如下:import sysimport osdef
- 本文目的是由浅入深地介绍python装饰器原理装饰器(Decorators)是 Python 的一个重要部分其功能是,在不修改原函数(类)定
- Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以搭配Python建网站,或者
- 早期写的python障碍式期权的定价脚本,供大家参考,具体内容如下#coding:utf-8'''障碍期权q=x/s
- MySQL有6种日志,监控数据库系统的时候必须知道select日志slow select日志变更日志二进制变更日志(binlog)
- 前言最近在学习vue框架的基本原理,看了一些技术博客以及一些对vue源码的简单实现,对数据代理、数据劫持、模板解析、变异数组方法、双向绑定有
- 经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢? 比如: <?php $ar