0 小组成员
李世钰 / 2017202110264
王成科 / 2017282110249
1 项目 GitHub 地址 && 演示地址
GitHub: https://github.com/lishiyuwhu/Homework/tree/master/SE/HW3
2 预估耗时
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 420 | 600 |
· Design Spec | · 生成设计文档 | 30 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 60 | 80 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 50 |
· Coding | · 具体编码 | 120 | 180 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 40 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 20 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 50 |
合计 | 860 | 1085 |
3 解题思路
开始的时候, 首先确定使用python进行开发. 之后就GUI工具进行了比较, 选用了PyQt, 最终决定PyQt5+python3的开发环境. 资料并不多, 开始看了使用一些中文资料, 而后PyQt5 tutorial配合官方文档进行学习.
计时模块方面, 原意是直接在旁边写一个时钟. 但学习时发现应该使用多线程, 否则会计时不准. 最后采用的方案是调用clock()函数, 每次检查答案时会返回时间.
三个目标:
-
记录对错: 生成一个txt用来存储记录
完成
-
计时: 主界面旁边再写个计时器模块
多线程调用clock()
-
多语言:
三个语言的txt, 需要使用时候从中调用使用Qt的多语言工具
4 设计实现过程
首先修改了HW2, 得到一个
def produceOpListMid(): # 返回一个[str(OpList), ANS] i.e.[' 4/3 + 2/3 ÷ 9/7 - 7/8', [Fraction(211, 216)]]
函数作为GUI调用的主体.
实现顺序:
基本功能GUI -> 记录对错 -> 计时功能 -> 多语言切换
5 代码说明
两个槽函数来实现记录存储. 在运行目录下生成一个file.txt记录答对的题目数和已答题的数目
def newfile(self): f = open('file.txt', 'w') f.write('0\n0') f.close() clock() self.putstrin() self.scoreEdit.setText( '正确题目数: 0 \n题目总数: 0 \n分数: 无 \n时间%.f s' % 0) def loadfile(self): global rightnum, totalnum try: f = open('file.txt', 'r') except: f = open('file.txt', 'w') f.write('0\n0') twonum = f.readlines() f.close() rightnum = int(twonum[0]) totalnum = int(twonum[1]) if totalnum == 0: self.scoreEdit.setText( '正确题目数: 0 \n题目总数: 0 \n分数: 无 \n时间%.f s' % 0) else: self.outputtobox()
6 测试运行
对修改后的convAndPrint2(equList)进行了单元测试, 发现了一个括号处理的问题.
生成题目
输入答案
给出正误判断和用时情况
7 合作情况
7.1 李世钰
经过前期讨论, 确定由我确定主体框架, 使用的语言, GUI工具等. 我首先负责学习资料的搜集, GUI的绘制和部分功能的实现, 之后王成科负责剩余的功能和文书.
两个人结对编程的视野会更开阔. 比如我在搜集资料的时候, 看到计时器模块基本都是需要多线程的操作以防主线程卡顿造成计时不准. 但之后对接的时候, 结对伙伴提出其实并不用真的需要一个后台时钟, 只要每次判题显示对错时能够同时显示一个经过的时间即可. 最后采用了clock()函数在每次刷新成绩栏的时候调用.
7.2 王成科
本次我主要负责实现了计时模块的修改和GUI的部分修改。
8 项目小结
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 15 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 420 | 600 |
· Design Spec | · 生成设计文档 | 30 | 20 |
· Design Review | · 设计复审 (和同事审核设计文档) | 60 | 80 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 50 |
· Coding | · 具体编码 | 120 | 180 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 40 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 20 | 10 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 50 |
合计 | 860 | 1085 |
8.1 李世钰
最大的问题出现在了多语言动态切换. 首先是中文引起的乱码, 查阅资料发现Qt Linguist不能处理中文转英文, 但可以英文转其他语言, 于是把源文件重写成了英文. 而后通过Qt Linguist进行翻译, 实现了静态加载的翻译. 但动态切换方面, 需要在切换之后刷新GUI, 而刷新GUI的retranslateUi()函数每次使用均会造成GUI崩溃. 暂时查不到原因.
~~初步原因推测是UI和逻辑分离造成?~~
然而并不是
这次最大的收获是有了和别人一起编程的经验, 和想象中还是不太一样的, 要统一两个人的想法和方向, 需要很多的交流. git的使用上也出现了一些问题.还有, 见识到了GUI的大体框架, 没有接触之前觉得GUI的绘制和后端的编码很难整合, 接触了UI和逻辑分离的方法之后感觉打开了思路.
还有一个比较大的收获是关于新技术的学习方面. 开始接触PyQt的时候感觉一头雾水, 各种新的概念都不知道什么意思. 但现在看来浪费了一些时间在某些并不核心的东西上. 重要的是应该先把握开发流程搞清楚, 每一块都是干什么. 理解了UI逻辑分离的概念, 就明白为什么有的demo把所有代码都写在一起, 而使用Qtdesigner的demo都是分块编写的. 先把握主干, 然后简单实现功能work起来再添加功能.
不足的地方就是, 看到别人写的之后, 觉得还是直接写一个table然后生成题目放在里面的展示形式更好, 我这个操作有点麻烦了. 还有程序中全局变量使用总是胆战心惊的, 还是写一个专门管理这几个变量的函数更安全一点.
8.2 王成科
上一阶段计算器是java实现的,这次实现界面使用python,又一次学习机会,结对编程也收获很多。
一开始不喜欢有人对自己写着东西指手画脚的,但是队友提供的思路,给出的意见,会帮助自己换一个新思路,慢慢的效率也会提升一些,更早发现问题也更快能解决,团队的重要性应该就是从两个人的合作开始体现的吧。
另外一个比较大的收获是从PyQt5实例源码中看到的python编程的精悍之处,自己本身逻辑思考能力一般,感觉对PyQt5的了解还只是冰山一角,但是这应该是很好的学习教材,无论是对于编程,代码规范和思考能力,我会继续膜拜的。
9 结对照片
10 中程汇报
进展:
实现了作业2基本功能的GUI. 作业3要求尚未添加
问题:
网上PyQt5的资料不多, 全靠读文档, 功能添加进展缓慢. 以及一个未查原因的几率崩溃Bug