目录
问题2
作业基本信息
【课程】福州大学2021级软件工程A | https://bbs.csdn.net/forums/ssynkqtd-05 |
---|---|
这个作业要求在哪里 | https://bbs.csdn.net/forums/ssynkqtd-05 |
这个作业的目标 | 实现一个简易计算器,要求具有图形化界面。功能:具有基本功能的计算器实现加、减、乘、除、归零基本操作。附加功能:具有科学计算的算器实现次方、幂、三角函数等操作。 |
其他参考文献 |
Gitcode项目地址
运行方式
1695918049843
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 0 | 0 |
Estimate | 估计这个任务需要多少时间 | ||
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 90 | 135 |
Design Spec | 生成设计文档 | 0 | 0 |
Design Review | 设计复审 | 0 | 0 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
Design | 具体设计 | 40 | 60 |
Coding | 具体编码 | 60 | 40 |
Code Review | 代码复审 | 10 | 15 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 50 |
Reporting | 报告 | 20 | 30 |
Test Repor | 测试报告 | 10 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 20 | 10 |
Size Measurement | 测试报告 | 280 | 360 |
解题思路描述
查询相关资料时发现使用python语言及使用tkinter库能较轻松地进行可视化界面的创建,学习相关内容后便较轻松的完成简易计算器的设计
问题1
如何使计算器有可视化界面?
用tkinter库的.Tk()函数创建界面.Frame()函数设置按键区,最后用循环创建按钮
问题2
如何将按钮与操作联系起来?
将按钮的文本和事件绑定到函数上。在函数中根据按钮的文本执行相应的操作
接口设计和实现过程
root = tk.Tk()及之后代码创建一个300x400大小的窗口, display = tk.StringVar()及之后代码创建一个文本输入框用于显示计算结果或用户输入的表达式。 然后使用循环创建了按钮, 并将按钮的文本和事件绑定到button_click函数上。 在button_click函数中,根据按钮的文本执行相应的操作,更新显示的表达式或计算结果
关键代码展示
import tkinter as tk
def button_click(event):
current = display.get()
text = event.widget.cget("text")
if text == "=":
try:
result = eval(current)
display.set(result)
except Exception as e:
display.set("Error")
elif text == "C":
display.set("")
elif text == "←":
display.set(current[:-1])
else:
display.set(current + text)
root = tk.Tk()
root.geometry("300x400")
root.title("简易计算器")
root.attributes("-alpha", 0.9)
root.configure(bg="#f0f0f0")
display = tk.StringVar()
entry_field = tk.Entry(root, textvariable=display, font=("Helvetica", 20), justify='right', bd=5) # 设置输入框样式
entry_field.pack(fill=tk.X, ipadx=10, pady=10)
button_frame = tk.Frame(root, bg="#f0f0f0") # 设置按钮区域背景色
button_frame.pack()
buttons = [
["(", ")", "C", "←"],
["7", "8", "9", "+"],
["4", "5", "6", "-"],
["1", "2", "3", "*"],
[".", "0", "=", "/"]
]
for row in buttons:
for button_text in row:
button = tk.Button(button_frame, text=button_text, font=("楷体", 15, "bold"),height=2,width=3, relief=tk.RAISED, padx=3,pady=2) # 设置按钮样式
button.grid(row=buttons.index(row), column=row.index(button_text), padx=5, pady=5)
button.bind("<Button-1>", button_click)
root.mainloop()
性能改进
能力有限加时间较短未能实现开方,n次方及三角函数等功能。
界面未打磨,较为简陋
单元测试
import unittest
from tkinter import Tk, Button, Entry, StringVar
class TestCalculator(unittest.TestCase):
def setUp(self):
self.root = Tk()
self.display = StringVar()
self.entry_field = Entry(self.root, textvariable=self.display)
self.button = Button(self.root, text="=", font=("Helvetica", 15, "bold"))
def test_button_click_equals(self):
self.display.set("2+2")
self.button_click_function()
self.assertEqual(self.display.get(), "4")
def test_button_click_clear(self):
self.display.set("2+2")
self.button["text"] = "C"
self.button_click_function()
self.assertEqual(self.display.get(), "")
# 添加更多的测试用例...
def button_click_function(self):
current = self.display.get()
text = self.button.cget("text")
if text == "=":
try:
result = eval(current)
self.display.set(result)
except Exception as e:
self.display.set("Error")
elif text == "C":
self.display.set("")
elif text == "←":
self.display.set(current[:-1])
else:
self.display.set(current + text)
def tearDown(self):
self.root.destroy()
if __name__ == "__main__":
unittest.main()
运行结果
心得体会
本次简易计算器较为简单,但是受益匪浅,学会界面可视化以及如何使得按钮与函数相联系的方法