python实现科学计算器

Gitcode项目地址

github地址:https://github.com/zhironggu/cal1

页面及功能展示

cal

PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1510
Estimate估计这个任务需要多少时间720800
Development开发200240
Analysis需求分析 (包括学习新技术)200240
Design Spec生成设计文档2020
Design Review设计复审1010
Coding Standard代码规范 (为目前的开发制定合适的规范)1010
Design具体设计3040
Coding具体编码360480
Code Review代码复审1010
Test测试(自我测试,修改代码,提交修改)200360
Size Measurement计算工作量1010
.合计720800

解题思路描述

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库的基础知识。
编程中,需要学会查找官方文档和在线资源以获取帮助和解决问题。
认识到自己的信息检索能力和学习能力仍有很大不足,需要继续学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值