作业基本信息
这个作业属于哪个课程 | https://bbs.csdn.net/forums/ssynkqtd-05 |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/topics/617294583 |
这个作业的目标 | 实现一个具有图形化界面的计算器 |
学号 | 102102154 |
姓名 | 董奇 |
Gitcode项目地址
https://gitcode.net/2303_79914559/project1
PSP表格
PSP | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
计划 | 20 | 30 |
•估计这个任务需要多少时间 | 20 | 30 |
开发 | 460 | 580 |
•需求分析 | 15 | 20 |
•生成设计文档 | 25 | 30 |
•设计复审 | 20 | 20 |
•代码规范 | 20 | 20 |
•具体设计 | 50 | 60 |
•具体编码 | 150 | 180 |
•代码复审 | 30 | 50 |
•测试 | 150 | 200 |
报告 | 80 | 110 |
•测试报告 | 40 | 60 |
•计算工作量 | 10 | 10 |
•事后总结,并提出过程改进计划 | 30 | 40 |
合计 | 560 | 720 |
解题思路描述
1.语言选择:
本次作业要求的实现一个具有图形化界面的计算器,考虑到UI布局,便利性等多方面需求后,决定选择有丰富的库支持的Python
2.编程思路:
可以导入tkinter和math模块分别用于创建图形界面和进行数学运算,然后可以创建一个display对象,用于用户输入和输出…
代码和功能展示
代码
import tkinter as tk
import math
window = tk.Tk()
window.title("计算器")
window.geometry("300x500")
display = tk.Entry(window, font=("Arial", 20), justify="right")
display.pack(fill="x", padx=10, pady=10)
current_input = ""
def update_display():
global display, current_input
display.delete(0, "end")
display.insert(0, current_input)
def on_number_click(number):
global current_input
current_input += str(number)
update_display()
def on_operator_click(operator):
global current_input
if current_input and not current_input[-1] in "+-*/^":
current_input += operator
update_display()
def on_dot_click():
global current_input
if not current_input or current_input[-1] in "+-*/^":
current_input += "0."
elif "." not in current_input:
current_input += "."
update_display()
def on_clear_click():
global current_input
current_input = ""
update_display()
def on_delete_click():
global current_input
if current_input:
current_input = current_input[:-1]
update_display()
def on_equal_click():
global current_input
if current_input and not current_input[-1] in "+-*/^":
try:
expression = current_input.replace("^", "**")
result = round(eval(expression), 2)
current_input = str(result)
update_display()
except:
current_input = ""
display.delete(0, "end")
display.insert(0, "错误")
def on_bracket_click(bracket):
global current_input
current_input+=bracket
update_display()
def on_trig_click(trig):
global current_input
current_input += trig+'('
update_display()
button_frame = tk.Frame(window)
button_frame.pack(fill="both", expand=True)
buttons = [
("C", on_clear_click),
("DEL", on_delete_click),
("(", lambda:on_bracket_click('(')),
(")", lambda:on_bracket_click(')')),
("7", lambda: on_number_click(7)),
("8", lambda: on_number_click(8)),
("9", lambda: on_number_click(9)),
("/", lambda: on_operator_click("/")),
("4", lambda: on_number_click(4)),
("5", lambda: on_number_click(5)),
("6", lambda: on_number_click(6)),
("*", lambda: on_operator_click("*")),
("1", lambda: on_number_click(1)),
("2", lambda: on_number_click(2)),
("3", lambda: on_number_click(3)),
("-", lambda: on_operator_click("-")),
(".", on_dot_click),
("0", lambda: on_number_click(0)),
("=", on_equal_click),
("+", lambda: on_operator_click("+")),
("sin", lambda: on_trig_click("math.sin")),
("cos", lambda: on_trig_click("math.cos")),
("tan", lambda: on_trig_click("math.tan")),
("^", lambda: on_operator_click("^"))
]
row = 0
col = 0
for text, func in buttons:
button = tk.Button(button_frame, text=text, font=("Arial", 15), width=5, height=2, bg="white", fg="black",
command=lambda f=func: f())
button.grid(row=row, column=col, padx=5, pady=5)
col += 1
if col == 4:
row += 1
col = 0
window.mainloop()
功能展示
①加减乘除:
②三角函数和次方:
性能改进
第一版计算器无法进行三角函数和次方运算,并且无法让三角函数作为一个整体与其他数字一起进行加减乘除等计算,后续查阅资料,通过
单元测试
代码展示
import unittest
import calculator
class TestCalculator(unittest.TestCase):
def test_add(self):
self.assertEqual(calculator.add(1, 2), 3.0)
self.assertEqual(calculator.add(0, 0), 0.0)
def test_subtract(self):
self.assertEqual(calculator.subtract(5, 3), 2.0)
self.assertEqual(calculator.subtract(0, 0), 0.0)
def test_multiply(self):
self.assertEqual(calculator.multiply(2, 4), 8.0)
self.assertEqual(calculator.multiply(0, 0), 0.0)
def test_divide(self):
self.assertEqual(calculator.divide(10, 2), 5.0)
self.assertEqual(calculator.divide(0, 1), 0.0)
if __name__ == "__main__":
unittest.main()
异常处理
except:
# 如果发生异常,则清空当前输入,并在显示框中显示"错误"
current_input = ""
display.delete(0, "end")
display.insert(0, "错误")
效果展示:
心得体会
这次作业已经是一次相对简单的项目开发,但是仍旧花费了大量的时间。
本次经历让我切实体验了一次项目开发的全过程。通过这次的作业,真正体会到项目开发的不容易,开发过程中会遇到许许多多的错误,与一开始美好的设想会有很大的出入,编程的思路也会随着查阅资料的过程不断改变,不断优化。
在这次完成作业的过程中,学到了很多关于GUI编程以及用户交互的知识,受益良多,收获颇丰。