title: Software Engineering-HW3

date: 2017-10-05 10:04:08

tags: HW

小组成员

264 李世钰

249 王成科

项目地址

https://github.com/lishiyuwhu/Homework/tree/master/SE/HW3

运行 dist目录下的DONE.exe

运行方法(环境PyQt5+py3.6.2)

>python display_QWidget.py

本来想用pyinstaller打包成EXE, 但好像在py3.6下面有一些问题, 还没解决.

经查是py36不支持pyinstaller. 新建了py35的环境, 成功打包.

py35的环境下, 试了一下多语言动态切换居然就可以了, 血都要吐出来了, python这版本问题真是头疼.

主体的多语言没问题, 但

    self.scoreEdit.setText(self.tr(' Right Num: %d \n Total Num: %d \n Score: %.2f \n Time: %.f s') % (
rightnum, totalnum, 100 * (float(rightnum) / totalnum), clock()))

部分的语言无法切换.

改为

setText(self.tr('xxxx%1').arg(y))

形式后报错. 查询结果:

假如翻译文本中包含了需要动态显示的数据, 必须使用上面这种形式. arg()属于QString的方法. 然后PyQt5移除了QString, 转换为python的str

尝试了几种形式都是无法识别, 这点要去stackoverflow提个问才能知道该怎么做.

或者说修改GUI为这样

PSP

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

解题思路

开始的时候, 首先确定使用python进行开发. 之后就GUI工具进行了比较, 选用了PyQt, 最终决定PyQt5+python3的开发环境. 资料并不多, 开始看了使用一些中文资料, 而后PyQt5 tutorial配合官方文档进行学习.

计时模块方面, 原意是直接在旁边写一个时钟. 但学习时发现应该使用多线程, 否则会计时不准. 最后采用的方案是调用clock()函数, 每次检查答案时会返回时间.

三个目标:

  • 记录对错:

    生成一个txt用来存储记录

    完成

  • 计时:

    主界面旁边再写个计时器模块

    多线程

    调用clock()

  • 多语言:

    三个语言的txt, 需要使用时候从中调用

    使用Qt的多语言工具

设计实现过程

首先修改了HW2, 得到一个

def produceOpListMid():  # 返回一个[str(OpList), ANS]  i.e.[' 4/3 + 2/3 ÷ 9/7 - 7/8', [Fraction(211, 216)]]

函数作为GUI调用的主体.

由于前两个功能基本分离, 多语言要在最后GUI确定之后再添加.初步决定以:

基本功能GUI -> 记录对错 -> 计时功能 -> 多语言切换

的顺序进行

代码说明

两个槽函数来实现记录存储. 在运行目录下生成一个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()

测试运行

对修改后的convAndPrint2(equList)进行了单元测试, 发现了一个括号处理的问题.

运行截图:

合作情况

264 李世钰

经过前期讨论, 确定由我确定主体框架, 使用的语言, GUI工具等. 我首先负责学习资料的搜集, GUI的绘制和部分功能的实现, 之后王成科负责剩余的功能和文书.

两个人结对编程的视野会更开阔. 比如我在搜集资料的时候, 看到计时器模块基本都是需要多线程的操作以防主线程卡顿造成计时不准. 但之后对接的时候, 结对伙伴提出其实并不用真的需要一个后台时钟, 只要每次判题显示对错时能够同时显示一个经过的时间即可. 最后采用了clock()函数在每次刷新成绩栏的时候调用.

249 王成科

上一阶段计算器是java实现的,这次实现界面使用python,又一次学习机会,结对编程也收获很多。

一开始不喜欢有人对自己写着东西指手画脚的,但是队友提供的思路,给出的意见,会帮助自己换一个新思路,慢慢的效率也会提升一些,更早发现问题也更快能解决,团队的重要性应该就是从两个人的合作开始体现的吧。

另外一个比较大的收获是从PyQt5实例源码中看到的python编程的精悍之处,自己本身逻辑思考能力一般,感觉对PyQt5的了解还只是冰山一角,但是这应该是很好的学习教材,无论是对于编程,代码规范和思考能力,我会继续膜拜的。

项目小结

264 李世钰

最大的问题出现在了多语言动态切换. 首先是中文引起的乱码, 查阅资料发现Qt Linguist不能处理中文转英文, 但可以英文转其他语言, 于是把源文件重写成了英文. 而后通过Qt Linguist进行翻译, 实现了静态加载的翻译. 但动态切换方面, 需要在切换之后刷新GUI, 而刷新GUI的retranslateUi()函数每次使用均会造成GUI崩溃. 暂时查不到原因.

初步原因推测是UI和逻辑分离造成?

然而并不是

这次最大的收获是有了和别人一起编程的经验, 和想象中还是不太一样的, 要统一两个人的想法和方向, 需要很多的交流. git的使用上也出现了一些问题.还有, 见识到了GUI的大体框架, 没有接触之前觉得GUI的绘制和后端的编码很难整合, 接触了UI和逻辑分离的方法之后感觉打开了思路.

还有一个比较大的收获是关于新技术的学习方面. 开始接触PyQt的时候感觉一头雾水, 各种新的概念都不知道什么意思. 但现在看来浪费了一些时间在某些并不核心的东西上. 重要的是应该先把握开发流程搞清楚, 每一块都是干什么. 理解了UI逻辑分离的概念, 就明白为什么有的demo把所有代码都写在一起, 而使用Qtdesigner的demo都是分块编写的. 先把握主干, 然后简单实现功能work起来再添加功能.

不足的地方就是, 看到别人写的之后, 觉得还是直接写一个table然后生成题目放在里面的展示形式更好, 我这个操作有点麻烦了. 还有程序中全局变量使用总是胆战心惊的, 还是写一个专门管理这几个变量的函数更安全一点.

249 王成科

上一阶段计算器是java实现的,这次实现界面使用python,又一次学习机会,结对编程也收获很多。

一开始不喜欢有人对自己写着东西指手画脚的,但是队友提供的思路,给出的意见,会帮助自己换一个新思路,慢慢的效率也会提升一些,更早发现问题也更快能解决,团队的重要性应该就是从两个人的合作开始体现的吧。

另外一个比较大的收获是从PyQt5实例源码中看到的python编程的精悍之处,自己本身逻辑思考能力一般,感觉对PyQt5的了解还只是冰山一角,但是这应该是很好的学习教材,无论是对于编程,代码规范和思考能力,我会继续膜拜的。

合影

Software Engineering-HW3 264&249的更多相关文章

  1. Software Engineering: 3. Project planning

    recourse: "Software Engineering", Ian Sommerville Keywords for this chapter: planning sche ...

  2. 第二篇——The communication during software engineering.

    I've learned a lot in my software engineering class about how a program comes out.That's also a esse ...

  3. Software Engineering: 2. Project management

    resources:"Software Engineering" Ian Sommerville For most projects, important goals are: D ...

  4. Software Engineering: 1. Introduction

    Resource: Ian, Sommerville, Software Engineering 1. Professional software development 1.1 Software e ...

  5. SENG201 (Software Engineering I) Project

    SENG201 (Software Engineering I) ProjectSpace ExplorerFor project admin queries:For project help, hi ...

  6. 个人阅读作业2—《No Silver Bullet: Essence and Accidents of Software Engineering》读后感

    在进行了一次结对编程.一次团队编程和一次个人编程项目后,读了<No Silver Bullet: Essence and Accidents of Software Engineering> ...

  7. Software Engineering at Google

    Google的Fergus Henderson在Software Engineering at Google中介绍了Google的软件工程实践. 软件开发 源码仓库 单一源代码仓库,除了核心配置和安全 ...

  8.  Go is more about software engineering than programming language research.

    https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Softwar ...

  9. 10. Software, Software Engineering, water fall (瀑布模型),Code Complete等名词的来源

    ①.Software-软件”一词是20世纪60年代才出现的,软件Software——1958年由贝尔实验室的著名统计学家John Tukey 提出软件与硬件一起构成完整的计算机系统,它们是相互依存,缺 ...

随机推荐

  1. CF AIM Tech Round 3 (Div. 2) D - Recover the String

    模拟 首先可以求出 0 和 1 的个数 之后按照01 10 的个数贪心安排 细节太多 错的都要哭了 #include<bits/stdc++.h> using namespace std; ...

  2. vue cli创建的项目 当你后期使用了ES6语法,如何解决浏览器兼容问题

    最近开发了一个项目,开发过程中,由于需要使用了async await ,于是发现,只有少数的浏览器支持,极大多数的浏览器是不支持这玩意的,在网上各种找解决方案,基本都是失败,最后总结了两个方案之后,尝 ...

  3. 主席树总结(经典区间第k小问题)(主席树,线段树)

    接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...

  4. 【NOI2001】炮兵阵地(状态压缩,动态规划)

    题面 题面中有图片的存在,所以就贴个地址把 题解 简单题,,,, 原来一直觉得不会做... 现在发现是一道傻逼题 暴力压两行的状态 发现就需要滚一维. 然后暴力检查一下状态的可行性 DP检查MAX就可 ...

  5. [SDOI2013]森林

    主席树 离散化后 每个点储存从根到它的路径上的点权 新加边时直接用启发式合并,直接把size小的重构 询问时sum[u]+sum[v]-sum[lca]-sum[fa[lca]]来比较,在树上二分 L ...

  6. 【Android】[Problem]-"Waiting for target device to come online".

    环境: win10专业版(创意者),Android studio 2.3.1 问题描述: 安装玩Android studio之后创建一个项目,建立AVD之后,运行程序时一直不能启动AVD,具体描述为: ...

  7. c# winform中的一段代码赏析

    我遇到了一个bug,是客户测试我们的产品,报出来的,而且有异常信息文件,这对于定位问题,很有帮助. 我找到源码看了下,bug还无法重现.于是我随便点点客户端,经过了几次调试,结果报出错误来了.客户端界 ...

  8. DevExpress中GridControl自定义汇总列值(有选择性的汇总)

    今天碰到有同事遇到这个方面的需求,贴一下吧. private void gvTop_CustomSummaryCalculate(object sender, CustomSummaryEventAr ...

  9. 深入解析条件变量(condition variables)

    深入解析条件变量 什么是条件变量(condition variables) 引用APUE中的一句话: Condition variables are another synchronization m ...

  10. c++中回调函数和函数指针的使用

    #include "stdafx.h" #include <iostream> //#include <string> using namespace st ...