计算器的设计
1.实验要求
这个作业属于哪个课程 | <2301-计算机学院-软件工程社区-CSDN社区云> |
---|---|
这个作业要求在哪里 | <软件工程实践第一次作业-CSDN社区> |
这个作业的目标 | <
|
其他参考文献 | Python 基础实战100例·第4期:自制简易计算器_哔哩哔哩_bilibili python语言基础--如何制作简易的计算器_哔哩哔哩_bilibili 花了一周终于整理好了!全网最全Python tkinter教程!包含所有知识点!轻松做出好看的tk程序!_哔哩哔哩_bilibili python(tkinter)案例教学:制作-计算器(上)界面编写_哔哩哔哩_bilibili 【Python案例】Python tkinter 制作一个经典的登录界面和点击事件_python tkinter界面设计-CSDN博客
|
2.解题思路
1.用tkinter添加各种按键
2.为数字赋予按键意义
3.添加等函数
4.添加清除一位以及全部清除函数
5.设置按键反馈,按下去的必须进行输出到结果栏
6.以上就是完成了一个简易计算器的程序
7.在简易计算器上面添加一个math库,为简易计算器添加各种按键,使之可以进行三角函数,乘方,开方的运算,让其变为一个科学计算器
3.关键代码展示
实现简易计算器功能
第一步,要先自定义一个计算器的背景,方便后边进行tkinker的按键添加
#102101117刘建鑫 简单计算器
import tkinter as tk
root=tk.Tk()
root.title('102101117计算器')#计算器名称
root.geometry('295x280+640+180')#边距,位置
root.attributes("-alpha",0.9)#设置透明度
font=('楷书',20)#设置字体
font_1=('宋体',16)#设置按键字体
第二步,添加结果栏
#显示最新状态,就是结果栏
result_num=tk.StringVar()
result_num.set('')#初始结果为空
tk.Label(root,
textvariable=result_num, font=font, height=2,
width=20,justify=tk.LEFT,anchor=tk.SE
).grid(row=1,column=1,columnspan=4
)#网格布局
第三步,添加各种按键
#接下来是按键,总第二行
button_clear=tk.Button(root,text='AC',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#AC按键
button_back=tk.Button(root,text='<-',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#回退
button_chu=tk.Button(root,text='/',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#除
button_cheng=tk.Button(root,text='*',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#乘
#设置按键类型,按键位置以及按键间隔,第二行
button_clear.grid(row=2,column=1,padx=4,pady=2)
button_back.grid(row=2,column=2,padx=4,pady=2)
button_chu.grid(row=2,column=3,padx=4,pady=2)
button_cheng.grid(row=2,column=4,padx=4,pady=2)
#接下来是按键,总第三行
button_7=tk.Button(root,text='7',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#7按键
button_8=tk.Button(root,text='8',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#8
button_9=tk.Button(root,text='9',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#9
button_jian=tk.Button(root,text='-',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#-
#设置按键类型,按键位置以及按键间隔,总第三行
button_7.grid(row=3,column=1,padx=4,pady=2)
button_8.grid(row=3,column=2,padx=4,pady=2)
button_9.grid(row=3,column=3,padx=4,pady=2)
button_jian.grid(row=3,column=4,padx=4,pady=2)
#接下来是按键,总第四行
button_4=tk.Button(root,text='4',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#4按键
button_5=tk.Button(root,text='5',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#5
button_6=tk.Button(root,text='6',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#6
button_jia=tk.Button(root,text='+',width=5,font=font_1,relief=tk.FLAT,bg='#7FFF00')#+
#设置按键类型,按键位置以及按键间隔,总第四行
button_4.grid(row=4,column=1,padx=4,pady=2)
button_5.grid(row=4,column=2,padx=4,pady=2)
button_6.grid(row=4,column=3,padx=4,pady=2)
button_jia.grid(row=4,column=4,padx=4,pady=2)
#接下来是按键,总第五行
button_1=tk.Button(root,text='1',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#1按键
button_2=tk.Button(root,text='2',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#2
button_3=tk.Button(root,text='3',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#3
button_deng=tk.Button(root,text='=',width=5,height=3,font=font_1,relief=tk.FLAT,bg='#7FFF00')#=
#设置按键类型,按键位置以及按键间隔,总第五行
button_1.grid(row=5,column=1,padx=4,pady=2)
button_2.grid(row=5,column=2,padx=4,pady=2)
button_3.grid(row=5,column=3,padx=4,pady=2)
button_deng.grid(row=5,column=4,padx=4,pady=2,rowspan=2)
#接下来是按键,总第6行
button_0=tk.Button(root,text='0',width=12,font=font_1,relief=tk.FLAT,bg='#00FFFF')#0按键
button_dian=tk.Button(root,text='.',width=5,font=font_1,relief=tk.FLAT,bg='#00FFFF')#.
#设置按键类型,按键位置以及按键间隔,总第6行
button_0.grid(row=6,column=1,padx=4,pady=2,columnspan=2)
button_dian.grid(row=6,column=3,padx=4,pady=2)
完成上述部分,这个程序的雏形就出现了
第四步,添加按键函数
#添加按键函数
def click_button(x):
print('x:\t',x)
result_num.set(result_num.get()+x)#方便输入数据
#添加等函数
def deng():
opt_str=result_num.get()
result = eval(opt_str)
result_num.set(str(result))
#添加全部清除函数
def clear():
result_num.set('')
#添加清除一位函数
def back():
current_text = result_num.get()
result_num.set(current_text[:-1])
完成以上步骤,这个程序基本快做完了
第五步,设置按键反馈,将按键输入到结果栏
#设置按键响应
button_1.config(command=lambda:click_button('1'))
button_2.config(command=lambda:click_button('2'))
button_3.config(command=lambda:click_button('3'))
button_4.config(command=lambda:click_button('4'))
button_5.config(command=lambda:click_button('5'))
button_6.config(command=lambda:click_button('6'))
button_7.config(command=lambda:click_button('7'))
button_8.config(command=lambda:click_button('8'))
button_9.config(command=lambda:click_button('9'))
button_0.config(command=lambda:click_button('0'))
button_dian.config(command=lambda:click_button('.'))
button_jia.config(command=lambda:click_button('+'))
button_jian.config(command=lambda:click_button('-'))
button_cheng.config(command=lambda:click_button('*'))
button_chu.config(command=lambda:click_button('/'))
第六步,进行特殊按键的处理,比如清除键等于键,这种按键不会输出到结果栏但是会有相应的作用
#进行计算反馈
button_deng.config(command=deng)
button_clear.config(command=clear)
button_back.config(command=back)
完成以上步骤,这个简易计算器就实现了
实现科学计算器功能
第一步,将简易 计算器的代码复制过来,重新设置布局
#102101117刘建鑫 科学计算器
import tkinter as tk
import math#调用math库进行三角函数的计算
root = tk.Tk()
root.title('102101117计算器') # 计算器名称
root.geometry('295x360+640+180') # 边距,位置
root.attributes("-alpha", 0.9) # 设置透明度
font = ('楷书', 20) # 设置字体
font_1 = ('宋体', 16) # 设置按键字体
# 显示最新状态,就是结果栏
result_num = tk.StringVar()
result_num.set('') # 初始结果为空
tk.Label(
root,
textvariable=result_num,
font=font,
height=2,
width=20,
justify=tk.LEFT,
anchor=tk.SE
).grid(row=1, column=1, columnspan=4) # 网格布局
第二步,为sin,cos,tan等按键添加入简易计算器中,重新排布,使之变得美观
# 接下来是按键,总第3行
button_sin = tk.Button(root, text='sin', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00') # sin
button_cos = tk.Button(root, text='cos', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00') # cos
button_tan = tk.Button(root, text='tan', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00') # tan
button_chu = tk.Button(root, text='/', width=5, font=font_1, relief=tk.FLAT, bg='#7FFF00') # 除
# 设置按键类型,按键位置以及按键间隔,第3行
button_sin.grid(row=3, column=1, padx=4, pady=2)
button_cos.grid(row=3, column=2, padx=4, pady=2)
button_tan.grid(row=3, column=3, padx=4, pady=2)
button_chu.grid(row=3, column=4, padx=4, pady=2)
# 接下来是按键,总第4行
button_gen = tk.Button(root, text='√', width=12, font=font_1, relief=tk.FLAT, bg='#7FFF00') # 开方根号
button_kai = tk.Button(root, text='平方', width=12, font=font_1, relief=tk.FLAT, bg='#7FFF00') # 平方
第三步,为sin等新按键重新设计函数,使之对三角函数和pi进行特殊处理
# 对三角函数和π进行特殊处理
#检查是否为三角函数,并且将输入值转换为弧度
if x in ['sin', 'cos', 'tan']:
try:
angle = float(current_text)
if x == 'sin':
result_num.set(math.sin(math.radians(angle)))
elif x == 'cos':
result_num.set(math.cos(math.radians(angle)))
elif x == 'tan':
result_num.set(math.tan(math.radians(angle)))
except ValueError:
result_num.set('Error')
elif x == 'π':
result_num.set(math.pi)#对pi进行处理,使pi为π
elif x == '√':
result_num.set(math.sqrt(float(current_text)))
elif x == '平方':
result_num.set(float(current_text) ** 2)
else:
result_num.set(current_text + str(x)) # 方便输入数据
第四步,为等函数添加error,这样是防止出现会报错的情况
# 添加等函数
def deng():
opt_str = result_num.get()
try:
result = eval(opt_str)
result_num.set(str(result))
except Exception:#数据错误会输出error
result_num.set('Error')
第五步,为新按键设置按键响应
button_sin.config(command=lambda: click_button('sin'))
button_cos.config(command=lambda: click_button('cos'))
button_tan.config(command=lambda: click_button('tan'))
button_pi.config(command=lambda: click_button('π'))
button_gen.config(command=lambda: click_button('√'))
button_kai.config(command=lambda: click_button('平方'))
其余保持不变,这样,一个简易计算器就转变为科学计算器了,多了计算三角函数,平方 ,开方的计算
4.效果展示
简易计算器展示
简易计算器
科学计算器效果展示
科学计算器
5.psp表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1000 | 1300 |
• Estimate | • 估计这个任务需要多少时间 | 500 | 450 |
Development | 开发 | 800 | 1000 |
• Analysis | • 需求分析 (包括学习新技术) | 200 | 300 |
• Design Spec | • 生成设计文档 | 100 | 150 |
• Design Review | • 设计复审 | 60 | 75 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 100 | 100 |
• Design | • 具体设计 | 40 | 60 |
• Coding | • 具体编码 | 300 | 300 |
• Code Review | • 代码复审 | 60 | 60 |
• Test | • 测试(自我测试,修改代码,提交修改) | 80 | 120 |
Reporting | 报告 | 60 | 90 |
• Test Repor | • 测试报告 | 50 | 80 |
• Size Measurement | • 计算工作量 | 30 | 50 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 20 | 45 |
合计 | 1000 | 1500 |
7.性能改进
我这个程序代码有点繁琐,这个按钮在设计的时候其实好像是可以直接设计,把每一行的按钮符号都写出来好像也是可以的,这样可以减少代码量。
8.单元测试
暂时没学会,手动测试的结果显示没啥问题。
9.心路历程
刚开始我看到这个题目的时候,第一反应是想去找vs2022写一个MFC的一个c++代码,后面我就开始学习MFC,但是实在是太多了,我就把这个放弃了。后面又看到了使用windows窗口程序的c++程序,我这个vs不知道为啥不能创建c++的windows窗口程序,只能创建c#的,但是c#我都没学过这也放弃了;后面我又尝试了html+css+js,这个我也是从头开始学的,但是时间太赶了,如果我慢慢学肯定代码没法写。所以,我最后把目标转到python上边,这个有很多库函数可以使代码变得容易理解。所以后面我就慢慢查资料,看视频然后最后做了个python文件。毕竟这是第一次做项目,我看这个单元测试是真的看不懂,也不会写单元测试,只能自己手测一下,感觉没有什么大问题。
文件说是要把python打包成exe文件,我这个也找过了,说是要用命令行pip install pyinstall,但是我这个电脑根本用不了,所以这个打包文件就没有做,实在是不会做。只能说第一次做并没有什么经验,需要学习的地方还有很多,还需要继续努力。
10.github项目源代码
https://github.com/junfeibai/jisuanqi/blob/main/calculator.py(简易计算器)
https://github.com/junfeibai/jisuanqi/blob/main/Desmos.py(科学计算器)