python实现多功能计算器
核心语句:
eval语句,具有自动计算功能
借助tkinter完成图形界面描述
流程如下:
- 创建界面:
from tkinter import *
win=Tk()
win.title('计算器')
win.geometry('450x680')
结果如下:
2.放置按钮:
but7=Button(win,text=7,width=3,font=('Arial',31),command=lambda :numinput(7))#如果只是先添加命令可以先不添加command关键字
but8=Button(win,text=8,width=3,font=('Arial',31),command=lambda :numinput(8))
but9=Button(win,text=9,width=3,font=('Arial',31),command=lambda :numinput(9))
but4=Button(win,text=4,width=3,font=('Arial',31),command=lambda :numinput(4))
but5=Button(win,text=5,width=3,font=('Arial',31),command=lambda :numinput(5))
but6=Button(win,text=6,width=3,font=('Arial',31),command=lambda :numinput(6))
but1=Button(win,text=1,width=3,font=('Arial',31),command=lambda :numinput(1))
but2=Button(win,text=2,width=3,font=('Arial',31),command=lambda :numinput(2))
but3=Button(win,text=3,width=3,font=('Arial',31),command=lambda :numinput(3))
but0=Button(win,text=0,width=3,font=('Arial',31),command=lambda :numinput(0))
bu1=Button(win,text='ans',width=3,font=('Arial',31),command=ans_)
bu2=Button(win,text='π',width=3,font=('Arial',31),command=lambda :numinput(pi))
bu3=Button(win,text='e',width=3,font=('Arial',31),command=lambda :numinput(e))
bu4=Button(win,text='CE',width=3,font=('Arial',31),command=clear)
bu5=Button(win,text='del',width=3,font=('Arial',31),command=delete_n)
bu6=Button(win,text='x^2',width=3,font=('Arial',31),command=mi_2)
bu7=Button(win,text='1/x',width=3,font=('Arial',31),command=x_1)
bu8=Button(win,text='|x|',width=3,font=('Arial',31),command=juedui)
bu9=Button(win,text='exp',width=3,font=('Arial',31),command=lambda :add_char('exp'))
bu0=Button(win,text='mod',width=3,font=('Arial',31),command=lambda:add_char('%'))
b1=Button(win,text='sqrt()',width=3,font=('Arial',31),command=sqrt_)
b2=Button(win,text='(',width=3,font=('Arial',31),command=lambda :add_char('('))
b3=Button(win,text=')',width=3,font=('Arial',31),command=lambda :add_char(')'))
b4=Button(win,text='n!',width=3,font=('Arial',31),command=jiechen)
b5=Button(win,text='/',width=3,font=('Arial',31),command=lambda :add_char('/'))
b6=Button(win,text='x^y',width=3,font=('Arial',31),command=lambda :add_char('^'))
b7=Button(win,text='*',width=3,font=('Arial',31),command=lambda :add_char('*'))
b8=Button(win,text='10^x',width=3,font=('Arial',31),command=zhi_10)
b9=Button(win,text='-',width=3,font=('Arial',31),command=lambda :add_char('-'))
b0=Button(win,text='log',width=3,font=('Arial',31),command=log_)
b11=Button(win,text='+',width=3,font=('Arial',31),command=lambda :add_char('+'))
b12=Button(win,text='ln',width=3,font=('Arial',31),command=IN_)
b13=Button(win,text='+/-',width=3,font=('Arial',31),command=fu)
b14=Button(win,text='.',width=3,font=('Arial',31),command=lambda :add_char('.'))
b15=Button(win,text='=',width=3,font=('Arial',31),command=end1)
b6.place(x=0,y=320)
but7.place(x=90,y=320)
but8.place(x=180,y=320)
but9.place(x=270,y=320)
b7.place(x=360,y=320)but4.place(x=90,y=410)
but5.place(x=180,y=410)
but6.place(x=270,y=410)
b8.place(x=0,y=410)
b9.place(x=360,y=410)but1.place(x=90,y=500)
but2.place(x=180,y=500)
but3.place(x=270,y=500)
b0.place(x=0,y=500)
b11.place(x=360,y=500)b13.place(x=90,y=590)
but0.place(x=180,y=590)
b14.place(x=270,y=590)
b12.place(x=0,y=590)
b15.place(x=360,y=590)bu2.place(x=90,y=50)
bu3.place(x=180,y=50)
bu4.place(x=270,y=50)
bu1.place(x=0,y=50)
bu5.place(x=360,y=50)bu7.place(x=90,y=140)
bu8.place(x=180,y=140)
bu9.place(x=270,y=140)
bu6.place(x=0,y=140)
bu0.place(x=360,y=140)b2.place(x=90,y=230)
b3.place(x=180,y=230)
b4.place(x=270,y=230)
b1.place(x=0,y=230)
b5.place(x=360,y=230)
en=Entry(win,width=30,font=('Arial',20))
en.place(x=0,y=0)
结果如下:
- 为按钮添加执行命令(前面button创建时已经添加了,如果不添加可以先不加上command=关键字段):
ans=0.0
flag=0
falg=0
def er_yuan():num=str(en.get())for i in range(0,len(num)):if (str.isdigit(num[i]) or num[i] == '.') == 0:number=eval(num[0:i])print(number)en.delete(0,END)if num[i]=='^':en.insert(0,str(number**(eval(num[i+1:]))))else:en.insert(0,str(number*(10**eval(num[i+3:]))))return
def numinput(number):global flagif (flag):en.delete(0,END)flag=0first_num=en.get()en.delete(0,END)en.insert(0,str(first_num)+str(number))
def clear():en.delete(0,END)
def delete_n():en.delete(len(str(en.get()))-1,END)
def x_1():num=str(en.get())n=1# if(num[-1]==')'):#如果想要整体做1/x可以使用加括号的方法# en.delete(0,END)# en.insert(0,str(1/eval(num[1:-2])))# returnif(num[-1]==')'):for i in range(len(num)-2,0,-1):if(num[i]==')'):n+=1elif num[i]=='(':n-=1if(n==0):en.delete(0,END)# print(num[i+1:-2])en.insert(0,num[0:i]+str(1/eval(num[i+1:-1])))#注意切片也是满足左开右闭的情况,只有右侧不取数字时才有# 可以得到从对应位置到最后的结果returnfor i in range(len(num)-1,0,-1):if (str.isdigit(num[i]) or num[i]=='.')==0:pp=float(num[i+1:])if pp==0:en.delete(0,END)en.insert('error')print('ok')en.delete(0,END)en.insert(0,num[0:i+1]+str(1/pp))returnen.delete(0,END)en.insert(0,str(1/float(num[0:])))
def mi_2():num=str(en.get())for i in range(len(num)-1,0,-1):#只需要读到第二个字符即可,因为如果第二个字符都不是字符#则即使前面是字符也是属于单目符号(这里只有 自取负符号-)对结果无关紧要if (str.isdigit(num[i]) or num[i]=='.')==0:en.delete(0,END)en.insert(0,num[0:i+1]+str(eval(num[i:])*eval(num[i:])))returnen.delete(0,END)en.insert(0,str(eval(num)*eval(num)))
#当点了=之后如果第一个为数字则就可以重新开始若要使用之前的数据可以使用ans
# 但是如果是使用的符号则需要使用之前的数字不做修改
def add_char(x):global falgif (x=='exp' or x=='^'):falg=1num = en.get()en.delete(0,END)global flagif(flag):en.insert(0,str(ans)+x)flag=0else:en.insert(0, str(num) +x)
def end1():global ansglobal flagglobal falg# for i in str(en.get()):if falg:er_yuan()falg=0returnnum=eval(str(en.get()))en.delete(0,END)en.insert(0,str(num))ans=numflag=1
def ans_():global ansnum=en.get()en.delete(0, END)en.insert(0, str(num)+str(ans))
def juedui():num = str(en.get())en.delete(0, END)en.insert(0, str(abs(eval(num))))
def jiechen():num = str(en.get())en.delete(0, END)sum=1k=abs(eval(num))for i in range(2,k+1,1):sum*=ien.insert(0, str(sum))
def sqrt_():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i]=='.')==0:en.delete(0, END)en.insert(0, num[0:i+1] + str(math.sqrt(eval(num[i+1:]))))returnen.delete(0, END)en.insert(0, str(math.sqrt(eval(num))))
def zhi_10():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i]=='.')==0:en.delete(0, END)en.insert(0, num[0:i+1] + str(10**(eval(num[i+1:]))))returnen.delete(0, END)en.insert(0, str(10**(eval(num))))
def fu():num=en.get()en.delete(0,END)en.insert(0,'-'+str(num))
def log_():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i] == '.') == 0:en.delete(0, END)en.insert(0, num[0:i + 1] + str(math.log10(eval(num[i + 1:]))))returnen.delete(0, END)if eval(num[0:])<=0:en.insert(0,'error')returnen.insert(0, str(math.log10(eval(num[0:]))))def IN_():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i] == '.') == 0:en.delete(0, END)en.insert(0, num[0:i + 1] + str(math.log(eval(num[i + 1:]))))returnen.delete(0, END)if eval(num[0:]) <= 0:en.insert(0, 'error')returnen.insert(0, str(math.log(eval(num[0:]))))
结果如下:
完整代码:
from tkinter import *
from math import pi
from math import e
import math
win=Tk()
win.title('计算器')
win.geometry('450x680')
ans=0.0
flag=0
falg=0
def er_yuan():num=str(en.get())for i in range(0,len(num)):if (str.isdigit(num[i]) or num[i] == '.') == 0:number=eval(num[0:i])print(number)en.delete(0,END)if num[i]=='^':en.insert(0,str(number**(eval(num[i+1:]))))else:en.insert(0,str(number*(10**eval(num[i+3:]))))return
def numinput(number):global flagif (flag):en.delete(0,END)flag=0first_num=en.get()en.delete(0,END)en.insert(0,str(first_num)+str(number))
def clear():en.delete(0,END)
def delete_n():en.delete(len(str(en.get()))-1,END)
def x_1():num=str(en.get())n=1# if(num[-1]==')'):#如果想要整体做1/x可以使用加括号的方法# en.delete(0,END)# en.insert(0,str(1/eval(num[1:-2])))# returnif(num[-1]==')'):for i in range(len(num)-2,0,-1):if(num[i]==')'):n+=1elif num[i]=='(':n-=1if(n==0):en.delete(0,END)# print(num[i+1:-2])en.insert(0,num[0:i]+str(1/eval(num[i+1:-1])))#注意切片也是满足左开右闭的情况,只有右侧不取数字时才有# 可以得到从对应位置到最后的结果returnfor i in range(len(num)-1,0,-1):if (str.isdigit(num[i]) or num[i]=='.')==0:pp=float(num[i+1:])if pp==0:en.delete(0,END)en.insert('error')print('ok')en.delete(0,END)en.insert(0,num[0:i+1]+str(1/pp))returnen.delete(0,END)en.insert(0,str(1/float(num[0:])))
def mi_2():num=str(en.get())for i in range(len(num)-1,0,-1):#只需要读到第二个字符即可,因为如果第二个字符都不是字符#则即使前面是字符也是属于单目符号(这里只有 自取负符号-)对结果无关紧要if (str.isdigit(num[i]) or num[i]=='.')==0:en.delete(0,END)en.insert(0,num[0:i+1]+str(eval(num[i:])*eval(num[i:])))returnen.delete(0,END)en.insert(0,str(eval(num)*eval(num)))
#当点了=之后如果第一个为数字则就可以重新开始若要使用之前的数据可以使用ans
# 但是如果是使用的符号则需要使用之前的数字不做修改
def add_char(x):global falgif (x=='exp' or x=='^'):falg=1num = en.get()en.delete(0,END)global flagif(flag):en.insert(0,str(ans)+x)flag=0else:en.insert(0, str(num) +x)
def end1():global ansglobal flagglobal falg# for i in str(en.get()):if falg:er_yuan()falg=0returnnum=eval(str(en.get()))en.delete(0,END)en.insert(0,str(num))ans=numflag=1
def ans_():global ansnum=en.get()en.delete(0, END)en.insert(0, str(num)+str(ans))
def juedui():num = str(en.get())en.delete(0, END)en.insert(0, str(abs(eval(num))))
def jiechen():num = str(en.get())en.delete(0, END)sum=1k=abs(eval(num))for i in range(2,k+1,1):sum*=ien.insert(0, str(sum))
def sqrt_():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i]=='.')==0:en.delete(0, END)en.insert(0, num[0:i+1] + str(math.sqrt(eval(num[i+1:]))))returnen.delete(0, END)en.insert(0, str(math.sqrt(eval(num))))
def zhi_10():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i]=='.')==0:en.delete(0, END)en.insert(0, num[0:i+1] + str(10**(eval(num[i+1:]))))returnen.delete(0, END)en.insert(0, str(10**(eval(num))))
def fu():num=en.get()en.delete(0,END)en.insert(0,'-'+str(num))
def log_():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i] == '.') == 0:en.delete(0, END)en.insert(0, num[0:i + 1] + str(math.log10(eval(num[i + 1:]))))returnen.delete(0, END)if eval(num[0:])<=0:en.insert(0,'error')returnen.insert(0, str(math.log10(eval(num[0:]))))def IN_():num = str(en.get())for i in range(len(num) - 1, 0, -1):if (str.isdigit(num[i]) or num[i] == '.') == 0:en.delete(0, END)en.insert(0, num[0:i + 1] + str(math.log(eval(num[i + 1:]))))returnen.delete(0, END)if eval(num[0:]) <= 0:en.insert(0, 'error')returnen.insert(0, str(math.log(eval(num[0:]))))
but7=Button(win,text=7,width=3,font=('Arial',31),command=lambda :numinput(7))
but8=Button(win,text=8,width=3,font=('Arial',31),command=lambda :numinput(8))
but9=Button(win,text=9,width=3,font=('Arial',31),command=lambda :numinput(9))
but4=Button(win,text=4,width=3,font=('Arial',31),command=lambda :numinput(4))
but5=Button(win,text=5,width=3,font=('Arial',31),command=lambda :numinput(5))
but6=Button(win,text=6,width=3,font=('Arial',31),command=lambda :numinput(6))
but1=Button(win,text=1,width=3,font=('Arial',31),command=lambda :numinput(1))
but2=Button(win,text=2,width=3,font=('Arial',31),command=lambda :numinput(2))
but3=Button(win,text=3,width=3,font=('Arial',31),command=lambda :numinput(3))
but0=Button(win,text=0,width=3,font=('Arial',31),command=lambda :numinput(0))
bu1=Button(win,text='ans',width=3,font=('Arial',31),command=ans_)
bu2=Button(win,text='π',width=3,font=('Arial',31),command=lambda :numinput(pi))
bu3=Button(win,text='e',width=3,font=('Arial',31),command=lambda :numinput(e))
bu4=Button(win,text='CE',width=3,font=('Arial',31),command=clear)
bu5=Button(win,text='del',width=3,font=('Arial',31),command=delete_n)
bu6=Button(win,text='x^2',width=3,font=('Arial',31),command=mi_2)
bu7=Button(win,text='1/x',width=3,font=('Arial',31),command=x_1)
bu8=Button(win,text='|x|',width=3,font=('Arial',31),command=juedui)
bu9=Button(win,text='exp',width=3,font=('Arial',31),command=lambda :add_char('exp'))
bu0=Button(win,text='mod',width=3,font=('Arial',31),command=lambda:add_char('%'))
b1=Button(win,text='sqrt()',width=3,font=('Arial',31),command=sqrt_)
b2=Button(win,text='(',width=3,font=('Arial',31),command=lambda :add_char('('))
b3=Button(win,text=')',width=3,font=('Arial',31),command=lambda :add_char(')'))
b4=Button(win,text='n!',width=3,font=('Arial',31),command=jiechen)
b5=Button(win,text='/',width=3,font=('Arial',31),command=lambda :add_char('/'))
b6=Button(win,text='x^y',width=3,font=('Arial',31),command=lambda :add_char('^'))
b7=Button(win,text='*',width=3,font=('Arial',31),command=lambda :add_char('*'))
b8=Button(win,text='10^x',width=3,font=('Arial',31),command=zhi_10)
b9=Button(win,text='-',width=3,font=('Arial',31),command=lambda :add_char('-'))
b0=Button(win,text='log',width=3,font=('Arial',31),command=log_)
b11=Button(win,text='+',width=3,font=('Arial',31),command=lambda :add_char('+'))
b12=Button(win,text='ln',width=3,font=('Arial',31),command=IN_)
b13=Button(win,text='+/-',width=3,font=('Arial',31),command=fu)
b14=Button(win,text='.',width=3,font=('Arial',31),command=lambda :add_char('.'))
b15=Button(win,text='=',width=3,font=('Arial',31),command=end1)
b6.place(x=0,y=320)
but7.place(x=90,y=320)
but8.place(x=180,y=320)
but9.place(x=270,y=320)
b7.place(x=360,y=320)but4.place(x=90,y=410)
but5.place(x=180,y=410)
but6.place(x=270,y=410)
b8.place(x=0,y=410)
b9.place(x=360,y=410)but1.place(x=90,y=500)
but2.place(x=180,y=500)
but3.place(x=270,y=500)
b0.place(x=0,y=500)
b11.place(x=360,y=500)b13.place(x=90,y=590)
but0.place(x=180,y=590)
b14.place(x=270,y=590)
b12.place(x=0,y=590)
b15.place(x=360,y=590)bu2.place(x=90,y=50)
bu3.place(x=180,y=50)
bu4.place(x=270,y=50)
bu1.place(x=0,y=50)
bu5.place(x=360,y=50)bu7.place(x=90,y=140)
bu8.place(x=180,y=140)
bu9.place(x=270,y=140)
bu6.place(x=0,y=140)
bu0.place(x=360,y=140)b2.place(x=90,y=230)
b3.place(x=180,y=230)
b4.place(x=270,y=230)
b1.place(x=0,y=230)
b5.place(x=360,y=230)
en=Entry(win,width=30,font=('Arial',20))
en.place(x=0,y=0)mainloop()
python实现多功能计算器相关推荐
- python银行利息问题_python入门教程NO.8 用python写个存款利息计算器
python入门教程 python入门教程NO.8 用python写个存款利息计算器 本文涉及的python基础语法为def函数,return,函数的各参数示例,匿名函数等 函数初识 函数是一段组织好 ...
- python妙用桌面计算器
python当计算器--不是玩笑 python是一个好东西 度娘说: Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于1990 年代初设计,作为一门叫做ABC语言的替代 ...
- JavaGUI:多功能计算器(二)--AWT菜单对话框(源码说明)
用Java实现好玩的可DIY的音乐计算器v0.33 特点:个性化,定制化,可简单DIY: (不是什么程序都能简单DIY:) 一.功能简介: 计算器菜单&按键板功能: 加减乘除四则运算,十六进制 ...
- python存款模块_python入门教程NO.8用python写个存款利息计算器
python 入门教程 NO.8 用 python 写个存款利息计算器 本文涉及的 python 基础语法为 def 函数, return ,函数的各参数示例,匿名函数等 函数初识 函数是一段组织好的 ...
- python解释器的功能_python的解释器是什么?
python解释器是解释python脚本执行的程序.编写python代码保存后,我们会得到一个以.py为扩展名的文本文件.要运行此文件,就需要python解释器去执行.py文件. python解释器种 ...
- python网络爬虫的基本步骤-详解Python网络爬虫功能的基本写法
网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 1. 网络爬虫的定义 网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个 ...
- pycharm支持python3.8_PyCharm 2019.2 发布,Python 3.8功能的支持
PyCharm 2019.2已经发布了,令人兴奋的新功能,开始支持Python 3.8,改进的Jupyter Notebook体验以及更多其他更改. PyCharm 2019.2发布亮点: 改进了Ju ...
- python开发环境功能介绍_第一模块 第3章 Python介绍与环境配置
python入门(全为重点) 1. 编程语言介绍 编程语言分类.总结 2. python介绍 3. 解释器多版本共存 4. 运行python程序的两种方式 5. 一个python程序运行的三个步骤(* ...
- c语言洗牌发牌结构体,C语言程序设计课程设计多功能计算器、洗牌发牌、学生文件处理、链表处理.doc...
序号: 30 学号: 课 程 设 计 设计课程名称: C语言程序设计 题 目:多功能计算器.洗牌发牌.学生文件处理.链表处理 学 生 姓 名: 学 院(系):信息科学与工程学院 专 业 班 级: 指 ...
最新文章
- 推荐一篇文章,感觉学完Iterator模式后应当读一读
- python学生信息管理系统心得体会-python实现名片管理系统
- android 进lanucher的广播,(转)Android中Launcher对于AppWidget处理的分析:AppWidgetHost角色...
- es6 --- 使用proxy对数据进行劫持
- Hibernate的generator属性
- Canny边缘检测算法原理及其VC实现详解(二)
- Winform开发之ADO.NET对象Connection、Command、DataReader、DataAdapter、DataSet和DataTable简介...
- mysql 5.6 binlog组提交
- QT TextEdit设置背景、明文加密、弹出网站、弹出自定义对话框、gif动态图片、程序启动动画、打包程序、关闭事件
- TNS 无监听解决方案
- java内存泄漏与内存溢出
- 苹果mac微软表格处理工具:microsoftexcel
- 图片怎样压缩到100KB以下?怎样压缩图片小于100KB?
- ICML 2020论文笔记:地表最强文本摘要生成模型PEGASUS(天马)
- android apk如何压缩包,Android 打包Apk太大 如何进行压缩APK文件
- echarts 官网访问慢
- 用jacob为word表格设置边框线
- TunesKit Video Cutter for Mac(视频分割编辑工具)
- Qt小例子学习52 - 卡片游戏
- 使用Asponse.cells生成图片如何去掉水印