1 项目概述
1.1 项目结构
-
main.py
包含项目的运行主逻辑,也是编译运行的主文件
-
user.py
封装两个类:
-
User
类:用于描述一个用户的信息 -
UserManager
类:用于管理所有存在的用户(包括当前登录用户)以及用户文件夹
-
-
formula.py
核心算法模块,包含用于生成、保存试卷的一系列方法
Tips:初始状态下该文件夹不存在,系统运行之后才会生成该文件夹
-
GUI.py
继承自
gui
文件夹中类的集合,实现窗口设置的自定义操作 -
qss.py
包含界面样式的
qss
语句 -
gui 文件夹
-
reg_gui.py,phone_gui.py,identify_gui.py,choice_gui.py,changepwd_gui.py,number_gui.py,exam_gui.py,seeu_gui.py
注册、发送手机验证码、做题 等图形化界面类的封装
-
-
icon 文件夹
存放程序中样式要加载的图片
Tips:项目结构截图:
1.2 复用个人编程项目
由于搭档的个人项目代码严格采用面向对象的风格且层次结构更加清晰,所以采用队友的个人编程项目作为结对编程项目的基础,基于 PyQt5 实现 GUI 编写桌面应用程序。
-
个人项目中的User和UserManager类仍可以很好地复用,用来管理已注册和当前登录的用户,改进的地方在于由原来的用户信息保存至数据结构中修改为保存至部署在服务器上的数据库中,使得程序断电后数据也能保留。
-
Formula类仍是出题界面底层最核心的逻辑,生成结果时只要将' √ '替换为' sqrt ',将' ^2 '替换为' **2 '就能直接使用eval函数来计算式子的结果
def CalResult(self): fml = self.m_notcheckfml.replace('^', '**') fml = fml.replace('√', 'sqrt') res = "NaN" try: res = eval(fml) except ValueError: pass return res
-
在User,UserManager,Formula类的底层基础之上,我们基于PyQt5使用Qt Designer设计了登录、注册、做题等8个初始界面,并设计子类继承由 .ui 文件直接生成的主类以实现自定义功能(如登录、注册、查重等),之后在交互层将这些页面按一定逻辑连接起来并不断测试使之可完成既定功能,最后完成界面的美化。
2 界面展示
-
用户登录界面
-
手机验证码界面 & 注册界面
-
选择题目类型界面 & 输入题目数量界面
-
做题界面
-
显示分数界面 & 保存试卷界面
3 经验与教训
-
面向对象编程理念的重要性
个人编程项目中我就没有使用类来封装方法,在编写结对编程部分代码时,虽然在搭档的威胁下勉强使用了类来封装,但是由于理解不够深刻,直接修改由Qt Designer生成的原始类以及在类中大量使用全局变量和类外方法等,破坏了类的封装性以及接口的统一,当我把我的代码发给搭档合并时还被嫌弃了好一会儿。
面向对象编程思想是我们应具备的基本素养,面向对象风格的编码以接近人类的思维方式看待世界,将现实中的个体看成对象,通过对象交互完成目标任务,使软件工程公认的模块化、信息隐藏 、抽象、重用性等原则在面向对象风格下得以充分实现。希望自己在今后的编程中能够不断武装自己
-
编程知识与技能的积累
本次用到的PyQt5基本上是现用现学,包括编程过程中遇到两个最大的bug:
- 因为一个信号同时与两个信号处理函数建立了连接而导致全局变量使用异常,当时处理了好久才解决问题,但到如今还是不太清楚为什么重复连接的操作会影响全局变量的机理。
- 单选题的按钮在上一题选中之后下一题会保留按钮的选中状态,我们尝试了很多种方法最后都没能解决。
两天速成,可能并没有学习到更深层次的知识。编程技能的学习是一项长期的过程,在这个过程中不断尝试与实践才能真正将知识化为己有,达到运筹帷幄之中,决胜于千里之外的境界。用杨金民老师的话来说,IT行业的所有设置都是人为的,所以要多问为什么。如果早先就掌握了以为什么来引导编程学习,掌握了更多的编程知识,也就不会出现书到用时方恨少的尴尬局面。
4 感想
结对编程不仅是相互学习的过程,更是相互鼓励的过程,学习之路才刚刚开始!