基于Python的tkinter库用100行代码制作多功能计算器

目录

作业基本信息

PSP表格

 解题思路描述

问题一  可视化界面设计(接口实现过程)

问题二  内在逻辑设计(接口实现过程)

程序的异常处理与亮点

单元测试

心得体会


作业基本信息

这个作业属于哪个课程2301-计算机学院-软件工程
这个作业要求在哪里软件工程实践第一次作业
这个作业的目标完成一个具有可视化界面的计算器。
Gitcode项目地址软工第一次作业
其他参考文献单元测试和回归测试

PSP表格

PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划1515
• Estimate• 估计这个任务需要多少时间13701465
Development开发150250
• Analysis• 需求分析 (包括学习新技术)9090
• Design Spec• 生成设计文档1515
• Design Review• 设计复审1515
• Coding Standard• 代码规范 (为目前的开发制定合适的规范)2025
• Design• 具体设计100130
• Coding• 具体编码200160
• Code Review• 代码复审200170
• Test• 测试(自我测试,修改代码,提交修改)150150
Reporting报告150180
• Test Repor• 测试报告200200
• Size Measurement• 计算工作量5050
• Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划1515
合计13701465

功能实现

1.基础计算功能

  • 加减乘除,清除,退格

2.特殊附加功能

  • 弧度角度转换

  • 三角函数

  • 反三角函数

  • 幂运算,开根号

  • 阶乘

 解题思路描述

        相比于HTML、CSS,我本次更倾向于使用Python语言完成此次任务,首先是对于Python比较熟悉,其次是Python提供的tkinter库功能强大,基本能够满足计算器可视化界面的功能要求,并且代码量并不大。思路包括以下几个关键步骤:

  1. 创建GUI界面:首先,使用tkinter库创建计算器的用户界面。通过创建窗口、输入框和各种按钮,来构建用户界面。
  2.  设计按钮和功能:决定计算器界面上需要哪些按钮,以及每个按钮的功能。这些按钮包括数字、基本运算符(加、减、乘、除)、特殊运算符(开根号、对数、幂运算)、三角函数、反三角函数、等号、清除按钮等。
  3. 按钮点击事件:为每个按钮定义点击事件处理函数。这些处理函数将根据按钮的不同执行不同的操作,如添加数字到输入框、执行计算、清除输入等。
  4. 计算逻辑:实现计算逻辑,包括解析用户输入的表达式、进行数学计算,并将结果显示在输入框中。本次作业使用Python的内置eval()函数来执行基本的数学运算,极大减少了代码量。
  5. 错误处理:添加错误处理机制,以处理用户可能输入的无效表达式或错误操作。使用try-except语句来捕获异常并显示错误消息。
  6. 美化界面:美化计算器界面,设置按钮颜色、字体样式、窗口大小等,以提高用户体验。
  7. 测试和调试:在编写完代码后,进行测试和调试,确保计算器的各个功能正常工作。

问题一  可视化界面设计(接口实现过程)

如何设计可视化界面?

  1. 创建主窗口:使用tkinter库创建一个主窗口,设置窗口的标题和大小。

  2. 输入框设计:在主窗口中创建一个输入框,用于显示用户输入的表达式和计算结果。设置输入框的样式、宽度和位置。

    root = tk.Tk()
    root.title("non的计算器")
    
    # 设置背景颜色和字体
    root.geometry('500x380+100+100')
    root.configure(bg='#f0f0f0')
    font_style = ("Helvetica", 20)
    result_var = tk.StringVar()
    result_var.set('')
    entry = tk.Entry(root, width=30, font=font_style, bd=10)
    entry.grid(row=0, column=0, columnspan=7, padx=10, pady=20)
  3. 按钮设计:设计各种按钮,包括数字按钮、运算符按钮、功能按钮(如等号、清除按钮)以及特殊功能按钮(如三角函数、对数、开根号、幂运算等)。按钮可以用tk.Button创建,设置按钮的文本、样式和点击事件。

  4. 布局管理:使用布局管理器(如gridpackplace)来安排输入框和按钮的位置和大小。通常,数字按钮和运算符按钮可以使用网格布局排列,使界面整齐。设置按钮的颜色、字体样式、边框宽度等,以提高界面的可视吸引力。你可以使用fontbgfg等选项来自定义按钮的样式。

    #其余功能按钮
    button_plus = tk.Button(root, text="+", command=lambda: click_button('+'), **button_style, bg='#ee82ee')
    button_minus = tk.Button(root, text="-", command=lambda: click_button('-'), **button_style, bg='#ee82ee')
    button_multiply = tk.Button(root, text="*", command=lambda: click_button('*'), **button_style, bg='#ee82ee')
    button_divide = tk.Button(root, text="/", command=lambda: click_button('/'), **button_style, bg='#ee82ee')
    button_dot = tk.Button(root, text=".", command=lambda: click_button('.'), **button_style, bg='#6495ed')
    button_clear = tk.Button(root, text="AC", command=clear_entry, **button_style, bg='#6495ed')
    button_equals = tk.Button(root, text="=", command=equals, **button_double_style, bg='#6495ed')
    button_sqrt = tk.Button(root, text="√", command=lambda:  click_button('math.sqrt('), **button_style, bg='#e6e6fa')
    button_delete = tk.Button(root, text="DEL", command=delete_last_char, **button_style, bg='#6495ed')
    button_open_parenthesis = tk.Button(root, text="(", command=lambda: click_button('('), **button_style, bg='#6495ed')
    button_close_parenthesis = tk.Button(root, text=")", command=lambda: click_button(')'), **button_style, bg='#6495ed')
    button_sin = tk.Button(root, text="sin", command=lambda: click_button('math.sin('), **button_style, bg='#e6e6fa')
    button_cos = tk.Button(root, text="cos", command=lambda: click_button('math.cos('), **button_style, bg='#e6e6fa')
    button_tan = tk.Button(root, text="tan", command=lambda: click_button('math.tan('), **button_style, bg='#e6e6fa')
    button_pi = tk.Button(root, text="π", command=lambda: click_button('3.141592653589'), **button_style, bg='#6495ed')
    button_factorial = tk.Button(root, text="!", command=lambda: click_button('math.factorial('), **button_style, bg='#e6e6fa')
    button_e = tk.Button(root, text="e", command=lambda: click_button('2.718281828459'), **button_style, bg='#6495ed')
    
  5. 按钮事件绑定:为每个按钮绑定相应的点击事件处理函数。这些事件处理函数将在用户点击按钮时执行相应的操作,例如将按钮文本添加到输入框、执行计算、清除输入等。

lambda可以使我们在任何地方创建一个没有名字的单行函数。这个东西能在GUI里面帮到我们很大的忙,使我们的函数控制器能传递参数。

问题二  内在逻辑设计(接口实现过程)

如何设计内在逻辑?

  1. 按钮点击事件处理:为不同类型的按钮(数字、运算符、功能)分别编写事件处理函数。在这些函数中,根据按钮类型执行相应的操作。例如,数字按钮应将数字添加到输入框,运算符按钮应处理运算符的输入,功能按钮应执行特定的数学功能。

  2. 计算逻辑:设计计算逻辑,用于解析用户输入的表达式并执行数学运算。你可以使用Python的eval()函数来执行基本的数学运算,但要小心处理错误情况,例如用户输入无效表达式的情况。

    #使用equal函数
    def equals():
        entry.delete(0, tk.END)
        opt = result_var.get()
        try:
            result = eval(opt)
            result_var.set(str(result))
        except:
            result = "ERROR"
        result_var.set(str(result))
        entry.insert(tk.END, str(result))
  3. 错误处理:在计算逻辑中添加错误处理机制,以处理可能的异常情况。例如,如果用户输入无效表达式,可以弹出错误消息框。

  4. 特殊功能实现:对于包含三角函数、对数、幂运算、开根号等特殊功能,需要编写相应的数学函数或调用Python的数学库来实现这些功能。

  5. 结果显示:将计算结果显示在输入框中,以便用户查看。结果应在计算完成后更新。

  6. 清除功能:实现清除按钮的功能,允许用户清除输入框的内容。

#清除输入栏
def clear_entry():
    result_var.set('')
    entry.delete(0, tk.END)
#清除输入的最后一个字符
def delete_last_char():
    current_text = entry.get()
    if current_text:
        new_text = current_text[:-1]
        entry.delete(0, tk.END)
        entry.insert(tk.END, new_text)

关键代码已在上面展示,不再赘述,详情可见Gitcode。

程序的异常处理与亮点

        使用try-except语句来捕获异常并显示错误消息。其错误信息包含多种情况:除数为0、左右括号不匹配等等,对不符合规范的计算表达式进行检查,提高了程序的性能。

try
    ...
except
    ...

        程序的亮点在于对计算器的多功能基本达到,附加功能齐全,在实现加、减、乘、除、归零基本操作的基础上,进一步实现次方、幂、三角函数等操作,是具有科学计算的计算器。且可视化界面对用户十分友好,按键布局、质感较好,很符合一个计算器的形象。

单元测试

利用unittest 库进行单元测试,通常用 assertEqual()等 assert 断言语句进行验证。

测试代码如下:

class Test(unittest.TestCase):

    def test_one(self):
        result_var.set('3+4-7+8*9-6/3')
        equals()
        self.assertEqual(result_var, '70')


    def test_two(self):
        result_var.set('math.sin(pi)')
        equals()
        self.assertEqual(result_var, '0')


    def test_three(self):
        result_var.set('pow(2,10)')
        equals()
        self.assertEqual(result_var, '1024')

    def test_multiplication(self):
        result_var.set('math.sqrt(2*2)')
        equals()
        self.assertEqual(result_var, '2.0')

if __name__ == '__main__': 
    unittest.main()

分四个测试点进行测试,得到如下测试结果:

心得体会

        这次我是第一次接触到开发这种具有可视化界面的程序软件,收获很多。开发的方式有很多种,开发语言也不尽相同,因此要在开始着手之前计划好使用哪种方案和开发软件。在开始编写代码之前,确保你对计算器的需求有清晰明确的了解。不同的计算器可能有不同的功能,所以要确保你知道你要开发的计算器需要支持哪些操作。计算器通常涉及到数学运算,因此可以利用Python的数学库(如math模块)来简化数学计算的实现。最好使用手头可以直接用的,比较好上手的库函数或者软件,可以减少代码量,提高程序效率。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值