用python写一个简单的科学计算器
这是我在这里写的第二篇帖子,就稍微长一点吧。
人在老家,初学python,水平有限,加上这几天玩光遇,python大作业只能尽力写到下面的水平,写得比较匆忙,希望大家不要嫌弃。大家可以拿去修改完善,添加一些新功能,比如角度与弧度的替换,求阶乘之类的功能。
虽然代码有点多,但是很多代码都是类似的,最后实现的基本和我手机上自带的计算器差不多,除了不能直接在文本框上进行数据修改,已经一些功能例如阶乘按我的思路编写有些困难之外,别的目前看来没出大问题www
具体编写思路就是用一个字符串和列表接受输入并显示,使人可读,另一个字符串和列表将输入以python可读的方式记录,最后用eval()转换成表达式由python替我们计算,这就不需要考虑数学运算的优先级了。
编写程序中还有一点需要考虑的就是乘号×的省略问题,数学上可以省略,但计算机就要考虑具体情况。
之前我说没有阶乘这个功能,主要是n!的结合性与其他运算是相反的,比如x^y运算,用"**("运算就可以实现与其他代码运算的结合性一致,就不会出错。大家可以试着修改改进。
因为是我的大作业,需要体现学习成果,主要还是往课上知识靠,应该不会太难懂。
第二次写帖子,也不懂那么多,就不放运行结果了,麻烦,大家可以复制粘贴康康。
不多说直接上代码!
简易科学计算器代码
from tkinter import messagebox,Menu,Tk,Frame,LEFT,TOP,Button,Text,END,RIGHT
from math import *
class Math:
def __init__(self):#图形界面,简单朴素
self.s=' '
self.ssize=[]
self.r=''
self.rsize=[]
self.res=''
self.root=Tk()
self.root.title("数学计算器")
self.frm=Frame(self.root)
self.root.geometry('400x340')
self.frm.pack()
self.menux=Menu(self.root)
self.m1=Menu(self.menux,tearoff=0)
self.menux.add_cascade(label='关于',menu=self.m1)
self.m1.add_command(label='作者',command=self.writer)
self.m1.add_command(label='计算器',command=self.calculator)
self.m1.add_separator()
self.m1.add_command(label='退出',command=self.root.quit)
self.root.config(menu=self.menux)
self.frm_M=Frame(self.frm)
self.t_show=Text(self.frm_M, width=30, height=5, font =('Verdana',15))
self.t_show.pack()
self.frm_M.pack(side=TOP)
self.frm_R=Frame(self.frm)
self.t_showr=Text(self.frm_R, width=30, height=1, font =('Verdana',15))
self.t_showr.pack()
self.frm_R.pack(side=TOP)
self.frm_S0=Frame(self.frm)
self.frm_S0zuo=Frame(self.frm_S0)
self.frm_S1=Frame(self.frm_S0zuo)
Button(self.frm_S1,text="C", width=5, height=1,command=self.clear, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S1,text="+", width=5, height=1,command=self.addx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S1,text="-", width=5, height=1,command=self.subx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S1,text="×", width=5, height=1,command=self.mulx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S1,text="÷", width=5, height=1,command=self.divx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S1,text="←", width=5, height=1,command=self.deletex, font=('Arial', 10)).pack(side=LEFT)
self.frm_S1.pack(side=TOP)
self.frm_S2=Frame(self.frm_S0zuo)
Button(self.frm_S2,text="(", width=5, height=1,command=self.numberzuo, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S2,text=")", width=5, height=1,command=self.numberyou, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S2,text="x²", width=5, height=1,command=self.x2, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S2,text="x³", width=5, height=1,command=self.x3, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S2,text="x^y", width=5, height=1,command=self.xy, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S2,text="1/x", width=5, height=1,command=self.daoshu, font=('Arial', 10)).pack(side=LEFT)
self.frm_S2.pack(side=TOP)
self.frm_S0zuo.pack(side=LEFT)
self.frm_S0you=Frame(self.frm_S0)
Button(self.frm_S0you,text="=", width=5, height=3,command=self.resultx, font=('Arial', 10)).pack(side=RIGHT)
self.frm_S0you.pack(side=LEFT)
self.frm_S0.pack(side=TOP)
self.frm_S3=Frame(self.frm)
Button(self.frm_S3,text="π", width=5, height=1,command=self.numberpi, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S3,text="sin", width=5, height=1,command=self.sinx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S3,text="cos", width=5, height=1,command=self.cosx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S3,text="tan", width=5, height=1,command=self.tanx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S3,text="e", width=5, height=1,command=self.numbere, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S3,text="ln", width=5, height=1,command=self.lnx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S3,text="log", width=5, height=1,command=self.logx, font=('Arial', 10)).pack(side=LEFT)
self.frm_S3.pack(side=TOP)
self.frm_S4=Frame(self.frm)
Button(self.frm_S4,text="√ ̄", width=5, height=1,command=self.kai_2_fang, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S4,text="arcsin", width=5, height=1,command=self.arcsinx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S4,text="arccos", width=5, height=1,command=self.arccosx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S4,text="arctan", width=5, height=1,command=self.arctanx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S4,text="n√ ̄", width=5, height=1,command=self.kai_n_fang, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S4,text="e^x", width=5, height=1,command=self._ex, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S4,text="10^x", width=5, height=1,command=self._10x, font=('Arial', 10)).pack(side=LEFT)
self.frm_S4.pack(side=TOP)
self.frm_S5=Frame(self.frm)
Button(self.frm_S5,text="1", width=5, height=1,command=self.number1, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S5,text="2", width=5, height=1,command=self.number2, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S5,text="3", width=5, height=1,command=self.number3, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S5,text="4", width=5, height=1,command=self.number4, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S5,text="5", width=5, height=1,command=self.number5, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S5,text="6", width=5, height=1,command=self.number6, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S5,text="%", width=5, height=1,command=self.numberpercent, font=('Arial', 10)).pack(side=LEFT)
self.frm_S5.pack(side=TOP)
self.frm_S6=Frame(self.frm)
Button(self.frm_S6,text="7", width=5, height=1,command=self.number7, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S6,text="8", width=5, height=1,command=self.number8, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S6,text="9", width=5, height=1,command=self.number9, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S6,text="0", width=5, height=1,command=self.number0, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S6,text="INT", width=5, height=1,command=self.intx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S6,text="|x|", width=5, height=1,command=self.absx, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_S6,text=".", width=5, height=1,command=self.numberpoint, font=('Arial', 10)).pack(side=LEFT)
self.frm_S6.pack(side=TOP)
self.root.mainloop()
def writer(self):
messagebox.showinfo(title='关于作者',message='他是个好人!❤')
def calculator(self):
messagebox.showinfo(title='关于计算器',message='已实现作者的预期目标✌,有待优化升级✍')
def number1(self):#输入1
if self.s[-1] in ')eπ':
self.r=self.r+'*1'
self.rsize.append(2)
else:
self.r=self.r+'1'
self.rsize.append(1)
self.s=self.s+'1'
self.ssize.append(1)
self.show()
def number2(self):#输入2
if self.s[-1] in ')eπ':
self.r=self.r+'*2'
self.rsize.append(2)
else:
self.r=self.r+'2'
self.rsize.append(1)
self.s=self.s+'2'
self.ssize.append(1)
self.show()
def number3(self):#输入3
if self.s[-1] in ')eπ':
self.r=self.r+'*3'
self.rsize.append(2)
else:
self.r=self.r+'3'
self.rsize.append(1)
self.s=self.s+'3'
self.ssize.append(1)
self.show()
def number4(self):#输入4
if self.s[-1] in ')eπ':
self.r=self.r+'*4'
self.rsize.append(2)
else:
self.r=self.r+'4'
self.rsize.append(1)
self.s=self.s+'4'
self.ssize.append(1)
self.show()
def number5(self):#输入5
if self.s[-1] in ')eπ':
self.r=self.r+'*5'
self.rsize.append(2)
else:
self.r=self.r+'5'
self.rsize.append(1)
self.s=self.s+'5'
self.ssize.append(1)
self.show()
def number6(self):#输入6
if self.s[-1] in ')eπ':
self.r=self.r+'*6'
self.rsize.append(2)
else:
self.r=self.r+'6'
self.rsize.append(1)
self.s=self.s+'6'
self.ssize.append(1)
self.show()
def number7(self):#输入7
if self.s[-1] in ')eπ':
self.r=self.r+'*7'
self.rsize.append(2)
else:
self.r=self.r+'7'
self.rsize.append(1)
self.s=self.s+'7'
self.ssize.append(1)
self.show()
def number8(self):#输入8
if self.s[-1] in ')eπ':
self.r=self.r+'*8'
self.rsize.append(2)
else:
self.r=self.r+'8'
self.rsize.append(1)
self.s=self.s+'8'
self.ssize.append(1)
self.show()
def number9(self):#输入9
if self.s[-1] in ')eπ':
self.r=self.r+'*9'
self.rsize.append(2)
else:
self.r=self.r+'9'
self.rsize.append(1)
self.s=self.s+'9'
self.ssize.append(1)
self.show()
def number0(self):#输入0
if self.s[-1] in ')eπ':
self.r=self.r+'*0'
self.rsize.append(2)
else:
self.r=self.r+'0'
self.rsize.append(1)
self.s=self.s+'0'
self.ssize.append(1)
self.show()
def numberpoint(self):#输入小数点.
self.s=self.s+'.'
self.r=self.r+'.'
self.ssize.append(1)
self.rsize.append(1)
self.show()
def numberpercent(self):#输入百分号%
self.s=self.s+'%'
self.r=self.r+'/100'
self.ssize.append(1)
self.rsize.append(4)
self.show()
def clear(self):#清除
self.s=' '
self.r=''
self.ssize.clear()
self.rsize.clear()
self.t_showr.delete(0.0,END)
self.show()
def resultx(self):#得出结果
count1=self.r.count('(')
count2=self.r.count(')')
n=count1-count2
self.r=self.r+')'*n
try:
self.res=str(round(eval(self.r),8))
except:
self.t_showr.delete(0.0,END)
self.t_showr.insert('insert','错误')
else:
self.t_showr.delete(0.0,END)
self.t_showr.insert('insert','='+self.res)
self.show()
finally:
if n>0:
self.r=self.r[:-n]
def numbere(self):#输入e
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*e'
self.rsize.append(2)
else:
self.r=self.r+'e'
self.rsize.append(1)
self.s=self.s+'e'
self.ssize.append(1)
self.show()
def numberpi(self):#输入π
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*pi'
self.rsize.append(3)
else:
self.r=self.r+'pi'
self.rsize.append(2)
self.s=self.s+'π'
self.ssize.append(1)
self.show()
def addx(self):#选择+
self.s=self.s+'+'
self.r=self.r+'+'
self.ssize.append(1)
self.rsize.append(1)
self.show()
def subx(self):#选择-
self.s=self.s+'-'
self.r=self.r+'-'
self.ssize.append(1)
self.rsize.append(1)
self.show()
def mulx(self):#选择×
self.s=self.s+'×'
self.r=self.r+'*'
self.ssize.append(1)
self.rsize.append(1)
self.show()
def divx(self):#选择÷
self.s=self.s+'÷'
self.r=self.r+'/'
self.ssize.append(1)
self.rsize.append(1)
self.show()
def numberzuo(self):#输入(
self.s=self.s+'('
self.r=self.r+'('
self.ssize.append(1)
self.rsize.append(1)
self.show()
def numberyou(self):#输入)
self.s=self.s+')'
self.r=self.r+')'
self.ssize.append(1)
self.rsize.append(1)
self.show()
def deletex(self):#选择删
if len(self.ssize)!=0:
n=self.ssize[-1]
self.s=self.s[:-n]
self.ssize.pop(-1)
if len(self.rsize)!=0:
m=self.rsize[-1]
self.r=self.r[:-m]
self.rsize.pop(-1)
self.show()
def sinx(self):#选择sin
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*sin('
self.rsize.append(5)
else:
self.r=self.r+'sin('
self.rsize.append(4)
self.s=self.s+'sin('
self.ssize.append(4)
self.show()
def cosx(self):#选择cos
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*cos('
self.rsize.append(5)
else:
self.r=self.r+'cos('
self.rsize.append(4)
self.s=self.s+'cos('
self.ssize.append(4)
self.show()
def tanx(self):#选择tan
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*tan('
self.rsize.append(5)
else:
self.r=self.r+'tan('
self.rsize.append(4)
self.s=self.s+'tan('
self.ssize.append(4)
self.show()
def arcsinx(self):#选择arcsin
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*asin('
self.rsize.append(6)
else:
self.r=self.r+'asin('
self.rsize.append(5)
self.s=self.s+'arcsin('
self.ssize.append(7)
self.show()
def arccosx(self):#选择arccos
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*acos('
self.rsize.append(6)
else:
self.r=self.r+'acos('
self.rsize.append(5)
self.s=self.s+'arccos('
self.ssize.append(7)
self.show()
def arctanx(self):#选择arctan
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*atan('
self.rsize.append(6)
else:
self.r=self.r+'atan('
self.rsize.append(5)
self.s=self.s+'arctan('
self.ssize.append(7)
self.show()
def lnx(self):#选择ln
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*log('
self.rsize.append(5)
else:
self.r=self.r+'log('
self.rsize.append(4)
self.s=self.s+'ln('
self.ssize.append(3)
self.show()
def logx(self):#选择log
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*log10('
self.rsize.append(7)
else:
self.r=self.r+'log10('
self.rsize.append(6)
self.s=self.s+'log('
self.ssize.append(4)
self.show()
def x2(self):#选择x^2
self.s=self.s+'^(2)'
self.r=self.r+'**2'
self.ssize.append(4)
self.rsize.append(3)
self.show()
def x3(self):#选择x^3
self.s=self.s+'^(3)'
self.r=self.r+'**3'
self.ssize.append(4)
self.rsize.append(3)
self.show()
def xy(self):#选择x^y
self.s=self.s+'^('
self.r=self.r+'**('
self.ssize.append(2)
self.rsize.append(3)
self.show()
def _ex(self):#选择e^x
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*e**('
self.rsize.append(5)
else:
self.r=self.r+'e**('
self.rsize.append(4)
self.s=self.s+'e^('
self.ssize.append(3)
self.show()
def _10x(self):#选择10^x
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*10**('
self.rsize.append(6)
else:
self.r=self.r+'10**('
self.rsize.append(5)
self.s=self.s+'10^('
self.ssize.append(4)
self.show()
def daoshu(self):#选择1/x
self.s=self.s+'^(-1)'
self.r=self.r+'**(-1)'
self.ssize.append(5)
self.rsize.append(6)
self.show()
def kai_2_fang(self):#开根号
if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
self.r=self.r+'*sqrt('
self.rsize.append(6)
else:
self.r=self.r+'sqrt('
self.rsize.append(5)
self.s=self.s+'√'
self.ssize.append(1)
self.show()
def kai_n_fang(self):#开n次根号
self.s=self.s+'^(1÷'
self.r=self.r+'**(1/'
self.ssize.append(4)
self.rsize.append(5)
self.show()
def intx(self):#结果取整
tempx=round(eval(self.res),0)
self.t_showr.delete(0.0,END)
self.t_showr.insert('insert','='+str(int(tempx)))
def absx(self):#结果取绝对值
tempx=eval(self.res)
self.t_showr.delete(0.0,END)
self.t_showr.insert('insert','='+str(abs(tempx)))
def show(self):#表达式展示
self.t_show.delete(0.0,END)
self.t_show.insert('insert',self.s)
if __name__ == "__main__":
m=Math()