PyQt5+python+数据库可视化操作界面
前言
这是我 python 入门写的第一个项目,从前天晚上开始构思到今天做了第一个 Release。这两天时间做了读了 Qt 库和 pymssql 的不少文档,边学边做写了一个可视化窗口实现数据库的操作。对 PyQt 的理解也就限于槽和信号沟通环节,pymssql 主要是连接部分,并未过多涉及。内容为医院挂号系统,基本实现和练习了增删查改操作。介绍环境和配置上的操作以及搭建经验。
PyQt5 环境
参考PyQt5+python3+pycharm 开发环境配置
集成了 PyUIC 和 QtDeisgner。其中 Designer 跨语言,可以画一些简单的窗口和控件,输出.ui 格式的文件,利用 PyUIC 转码为.py 进行编辑。
PyQt 库非常庞大,但我实际操作主要聚焦于控件的方法和定义。Qt 的参考文档为 C++环境,结合 Pycharm 自动补全基本可以避开转换的问题。
可以看到 MainWindow 代码很长,但大部分都是 ui 文件转码自动生成的(retranslateUi、setupUi),实际需要编写的就是逻辑和实现部分。
数据库连接
由于要求和环境的限制,我使用了 SQL server 2012。MySQL,SQLite 等连接更为简洁方便。选用的库为 pymssql,参考官方文档pymssql
连接方面,需要首先登陆 SQL Management Studio 以管理员身份,然后设置中添加用于该项目连接的用户并给它授权。授权选项中我是全部勾选。
然后在其中建好设计好的两个表 Doctor(用于检索医生)和 Reg(用于前端操作)
注意设计时,将varchar()
数据类型更改为nvarcahar
,便于中文输入输出,同时连接时采用 utf8 字集:
1 | server = "DESKTOP-9RUT87E" |
之后阅读学习 python 中获取光标进行简单的数据库操作,即可实现在程序中实现数据库操作了,可以参考 pymaasql 的 example。
Python 编辑
本项目的意义在于简单的图像化操作代替数据库语言来实现数据的增删查改。考虑到绘制的问题,采用的简单的单一界面交互。对于多界面交互则需要绘制多个 ui 文件并在主程序中调用。
- QtDesigner 绘界面
非常方便地从左侧选取想要加入的元素,右侧属性栏也可以很好地自定义。对应生成了retranslateUi、setupUi 中的代码,参考意义不大故移入附录。
- 转码为.py 文件进行编辑
若搭建好开发环境,可直接从 Pycharm 中选择外部工具对 ui 文件转码,或是直接文件夹下 shift+右键打开 cmd 调用 pyuic 转码。
由于 QtDesigner 提供的信号和槽连接非常简单而且多数需要实现的功能为 SQL 连接和操作,故需要自定信号和槽函数来实现这些按钮,所以转码后在 IDE 中进行编写。
熟悉了 PyQT 空间的语法和事件命名方式后,就可以轻松写出自定槽函数来接受按钮信号,同时获取和改变它们的各种状态。有空会写 PyQt 常见类的常见操作供交流。接下来就是由设计的界面、数据库结构设计交互逻辑并实现。
交互设计
窗口的交互分了 7 个按钮,交互逻辑如下
查询在岗医生
根据科室和是否专家查询可用的医生挂号
挂号需要提供个人信息,同时根据需要挂的科室,可执行上一步操作,选择合适的医生,填入医生号码进行挂号
截图:此时点击挂号即可完成挂号
其中 1、2 两步顺序随意。
- 查、删、改
根据提供的信息构建操作来实现,要注意到这些信息并不是全部需要,例如可以查询急症科的所有病人,也可以查询具体的某一个人
例:查询急症科的男病人
- 记录日志
简单的文件写入操作
保存的 log:
实现
==
- 按钮槽函数的编写
DB_开头的函数为自定槽函数,用于响应按钮点击的事件。同时需要一些自定辅助函数和全局变量用于系统状态的维护。
编写思路见代码注释。 - 引用并执行
编写 HospitalRegSys.py 作为主程序来调用编写好的 ui 转码而来的文件,实现主程序和 UI 界面代码的分离,也方便添加多个界面。
1 | # HospitalRegSys0045.py |
主窗口代码
1 | # 不再提供 |
pyinstaller 生成可执行文件
生成 exe 的时候遇到了很多困难,和 python3.6 环境以及 pymssql、pyinstaller 设置的参数有关。经过多次测试和参考官方文档,在 cmd 中执行程序,根据报错“没有找到模块 XXX”,直接在主程序中引入该模块即可,即是
1 | import decimal |
这个模块和_mssql 有关,可见库和环境的不兼容性。
附录
数据库结构
retranslateUi、setupUi 代码
只需编辑 setupUi 最后连接部分的信号,以实现按钮的功能。
1 | # 不再提供 |