• Software Engineering-HW3 264&249



    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 
     Total Num: %d 
     Score: %.2f 
     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
    0')
            f.close()
            clock()
            self.putstrin()
            self.scoreEdit.setText(
                '正确题目数: 0 
    题目总数: 0 
    分数: 无 
    时间%.f s' % 0)
    
        def loadfile(self):
            global rightnum, totalnum
            try:
                f = open('file.txt', 'r')
            except:
                f = open('file.txt', 'w')
                f.write('0
    0')
    
            twonum = f.readlines()
            f.close()
            rightnum = int(twonum[0])
            totalnum = int(twonum[1])
            if totalnum == 0:
                self.scoreEdit.setText(
                    '正确题目数: 0 
    题目总数: 0 
    分数: 无 
    时间%.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的了解还只是冰山一角,但是这应该是很好的学习教材,无论是对于编程,代码规范和思考能力,我会继续膜拜的。

    合影

  • 相关阅读:
    WebRTC的一个例子
    Gerrit增加SSL证书
    Ruby on Rails 创建https应用
    使用Ruby来实现批量更新AD中字段
    pg gem 安装(postgresql94)
    Spark源码剖析(一):如何将spark源码导入到IDEA中
    Scala入门系列(十三):类型参数
    Scala入门系列(十二):隐式转换
    Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96
    Scala入门系列(十一):模式匹配
  • 原文地址:https://www.cnblogs.com/Plams/p/7651250.html
Copyright © 2020-2023  润新知