Gitcode项目地址
github地址:https://github.com/zhironggu/cal1
页面及功能展示
cal
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 10 |
Estimate | 估计这个任务需要多少时间 | 720 | 800 |
Development | 开发 | 200 | 240 |
Analysis | 需求分析 (包括学习新技术) | 200 | 240 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 360 | 480 |
Code Review | 代码复审 | 10 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 200 | 360 |
Size Measurement | 计算工作量 | 10 | 10 |
. | 合计 | 720 | 800 |
解题思路描述
0.规划计算器每个位置存放的按钮是什么。决定用python来实现,学习tkinter相关内容。
1.创建GUI窗口,在窗口第一行创建entryField作为文本框,用来存放和显示计算结果。
2.设置按钮button,设置按钮大小,颜色,调用的函数,注意什么时候换到下一行。
3.实现函数,先存下当前的文本框内容str,根据不同按钮选择是继续添加str,
还是算出结果answer。
…
实现过程及关键代码展示
1.导入tkinter和math库,分别用于创建可视化界面和计算数学符号的运算结果。
2.实现好窗口和文本框之后,用数组button_list存下按钮,由于Python 3里面,str在内存里是unicode表示的,所以部分字符编码需要去查询,和调用python的chr()函数。
****3.利用tkinter创建按钮
调用Button函数,bd是按钮边框的大小,默认为 2 个像素。bg是按钮背景色。
font是文本字体。command按钮关联的函数,当按钮被点击时,执行该函数,注意要用lambda,才能传入参数button。最后八个一行,注意换行。
for i in button_list:
button=Button(root,width=6,height=2,bd=2,relief=RAISED,text=i,bg='grey',fg='white',
font=('Arial',15,'bold'),command=lambda button=i: click(button))
button.grid(row=row_val,column=col_val)
col_val+=1
if col_val==8:
col_val=0
row_val+=1
****4.实现函数
str存入当前文本框的内容,C表示删除一个字符,CE表示删除文本框全部内容。
def click(button):
str = entryField.get()
answer=''
try:
if button=='C':
str=str[0:len(str)-1]
entryField.delete(0,END)
entryField.insert(0,str)
return
elif button=='CE':
entryField.delete(0,END)
return
如果按下根号,则先算出文本框内的结果,再将这个结果进行根号运算。得到的最终结果存入answer,最终呈现到文本框上。
这也是该代码的不足之处,只能先算出根号内的结果,再进行根号运算。注意要用eval函数,否则字符串进行根号运算会报错。
elif button=='√':
answer = math.sqrt(eval(str))
elif button=='π':
if str == "":
answer = math.pi
else:
entryField.insert(END,math.pi)
return
entryField.delete(0,END)
entryField.insert(0,answer)
`
性能改进
1.对常数 如π和e 的处理
改进之前只有`answer = math.pi * 2
这样的话一按2π这个按钮,屏幕只会显示2π的值,使之前屏幕上的内容消失。
改进之后比如要计算2*π,点击π按钮之后,屏幕会在乘号加上π的值3.14159,再点击等号按钮即可算出结果。
elif button=='2π':
if str == "":
answer = math.pi * 2
else:
entryField.insert(END, math.pi * 2)
return
2.return 提前终止的判断
由于输入“/ "后还要输入被除数,所以在原字符串后加上”/"后不需要执行answer的计算和呈现,直接返回即可。
elif button=='/':
entryField.insert(END,"/")
return
单元测试
import unittest
from tkinter import *
import cal2
class TestCalculator(unittest.TestCase):
def setUp(self):
self.root = Tk()
self.entryField = Entry(self.root, font=('Arial', 20, 'bold'), bg='black', fg='white', bd=20, relief=SUNKEN,
width=40)
self.entryField.grid(row=0, column=0, columnspan=8, pady=20)
self.calculator = cal2.Calculator(self.root, self.entryField)
def test_add(self):
result = self.calculator.calculate_expression("5 + 3")
self.assertEqual(result, 8)
def test_sub(self):
result = self.calculator.calculate_expression("10 - 2")
self.assertEqual(result, 8)
def test_mul(self):
result = self.calculator.calculate_expression("4 * 6")
self.assertEqual(result, 24)
def test_div(self):
result = self.calculator.calculate_expression("20 / 4")
self.assertEqual(result, 5)
def tearDown(self):
self.root.destroy()
if __name__ == '__main__':
unittest.main()
…
异常处理
不符合顺序的输入或者违反计算原则,直接跳过该次输入,即该次按按键是无效的。
如果是除以0或者对负数求log,系统会有错误提示。
elif button=='=':
answer = eval(str)
else:
entryField.insert(END,button)
return
entryField.delete(0,END)
entryField.insert(0,answer)
except SyntaxError:
pass
心得体会
本次自己动手编程实现了一个科学计算器,帮助自己熟悉Python编程和Tkinter库的基础知识。
编程中,需要学会查找官方文档和在线资源以获取帮助和解决问题。
认识到自己的信息检索能力和学习能力仍有很大不足,需要继续学习。