PyQt5环境安装
PC环境介绍
1 | Window 10 |
PyQt5环境安装
安装Sip
1
pip3 install Sip
安装PyQt5
1
pip3 install PyQt5
安装PyQt5 Tool
1
pip install PyQt5-tools -i http://pypi.douban.com/simple --trusted-host=pypi.douban.com
安装pyserial
1
pip install pyserial
添加环境变量
1
2QT_QPA_PLATFORM_PLUGIN_PATH
C:\Python\Python37\Lib\site-packages\PyQt5\Qt\plugins
PyQt5设计流程
Requirement
1
功能需求。在设计之前先想好要做怎样的一个东西,它包含哪些功能,把功能做一个列表
UI Design
1
UI设计分为两部分:Component(组件)和Layout(布局)
Component
1
组件。根据功能合理使用相应的组件
Layout
1
布局。合理布局可以使得UI更加美观,操作更直观
UI Test
1
UI测试。在使用UI组件和布局时,应该用实时预览功能测试组件使用是否符合预期,以便修改
Logical Code
1
逻辑代码。编程过程使用逻辑与UI代码分离,逻辑代码实现预期的功能
Optimize
1
优化。在测试代码过程中会发现很多小细节被遗漏,需要一步一步进行优化
PyQt5实战-Serial Tool V1.0
MCU应用工程师/嵌入式开发工程师在实际的工作中需要经常对设备进行调试,一般情况是通过上位机对下位机进行调试。本文使用PyQt5快速开发一个特定功能的串口上位机Serial Tool V1.0,环境搭建可以参考第一部分的介绍
功能规划
Serial Tool V1.0上位机根据需求实现一下功能:
- 实现与下位机串口通信(参数不可变)
- 可配置特定的输入通道、输出通道和和三组数据(0~1023)输出给下位机
- 能接收下位机发送的信息,并格式化显示
UI 设计
功能明确后,开始进行UI设计。UI设计使用designer.exe,位于C:\Python37\Lib\site-packages\pyqt5_tools目录下,打开时建议以管理员身份运行
注意:这里使用的是作者的Python的安装目录
组件
UI designer中的组件非常丰富,对于Serial Tool V1.0只是用了其中很少的组件。组件提供了很多的事件接口,如按钮的按下和松开都可以出发一个事件,用户可以灵活地设计功能。UI designer中还支持信号槽,即通过某个组件的事件来触发一个行为,如按下按钮改变标签的内容。下面介绍Serial Tool V1.0中使用的相关组件
Widget。小窗口,一般简单的GUI可以只使用Widget就够了。点击Nwe–>Widget创建,然后在右边的Property Editor窗口修改相关属性(窗口大小,背景颜色…等等)
QLabel。标签,使用率非常高的组件,通常配合其他组件用作说明、标识等等用途。在左边的组件栏选择QLabel组件拖放置到窗口中,然后双击修改内容,或者在在右边的Property Editor窗口修改内容及其相关属性(字体,字体大小,颜色,居中…等等),然后Ctrl+R可以预览窗口
QComboBox。下拉列表框,通常用于有限选择的选项列表。在左边组件栏选择QComboBox组件拖放到窗口中,然后双击添加下拉列表内容,同理也可以在右边的Property Editor窗口修改内容及其相关属性(字体,字体大小,颜色,居中…等等),然后Ctrl+R预览窗口
QPushButton。按钮,用作与开关量,在UI设计中最常见的组件之一。在左边组件栏选择QPushButton组件拖放到窗口中,然后双击修改按键标题,同理也可以在右边的Property Editor窗口修改内容及其相关属性(字体,字体大小,颜色,居中…等等),然后Ctrl+R预览窗口
QTextEdit。文本编辑框,用于输入文本或者接收文本显示使用。在左边组件栏选择QTextEdit组件拖放到窗口中,在右边的Property Editor窗口修改内容及其相关属性(字体,字体大小,颜色,居中…等等),然后Ctrl+R预览窗口
Layout
组件选好后就开始布局,布局有以下四种
Vertical Layout。垂直布局,让组件垂直排列。选择要垂直排列的组件,然后点击菜单栏的垂直布局的图标进行垂直布局
Horizontal Layout。水平布局,让组件水平排列。选择要水平排列的组件,然后点击菜单栏的水平布局的图标进行水平布局
Grid Layout。网格布局,让组件像网格一样有序排列。择要网格排列的组件,然后点击菜单栏的网格布局的图标进行网格布局
Form Layout。表格布局,让组件像表格一样排列。择要表格排列的组件,然后点击菜单栏的表格布局的图标进行表格布局
布局决定了应用的美观,在一个窗口中通常由很多的组件组成,组件之间可以组成一个一个功能模块,因此布局在其中的应用也是多种方式组合的,下图为Serial Tool V1.0应用的组件和布局窗口
PyQt5代码实现
UI设计好后,需要把.ui文件转为.py文件然后再应用。首先打开CMD命令行,然后切换到.ui文件所在的目录下,输入命令
1 | pyuic5 -x -o my_ui.py my_ui.ui |
注:上面的命令是把my_ui.ui文件转换为my_ui.py文件,用户根据需要修改文件名
转换完成后使用PyCharm打开文件(或者使用python的IDLE打开),运行文件查看效果
注:pycharm打开单独的文件可能需要配置python解释器才能运行,具体操作可以百度一下
到目前位置,根据预想的功能实现了Serial Tool V1.0的UI设计,并转换为py文件运行参看效果,从UI中可以知道后面需要用代码实现如下功能:
- 扫描介入PC端的串口设备并显示在COM下拉列表框中
- 当有设备接入时,按UI中的参数点击Open按钮打开串口,如果没有发现设备点击了Open需要提示错误信息
- 打开串口后,修改左下相关参数点击Send按钮能把参数按一定的格式发送出去
- 打开串口后,如果接收到信息,需要在文本编辑框中按一定的格式显示出来
使用PyCharm新建Serial Tool V1.0工程,然后把ui文件复制到工程目录下,再新建一个用于存放逻辑代码的py文件(my_main.py),下面内容开始讲述相关的逻辑代码实现
导入相关库
程序中会使用很多python库,如果对python比较熟悉都是使用相关函数再导入与之相关的库,下面列出工程中需要导入的python库
1 | from PyQt5 import QtCore, QtGui, QtWidgets |
Serial Tool V1.0运行流程
程序运行流程大致为:启动,初始化界面,打开串口,发送数据。其中还涉及几部分,如打开串口后接收数据、按下Clear按钮清除接收内容、刷新串口、没有打开串口前按Send按钮需要提示错误信息、数据的格式化发送和接收等等
Serial Tool V1.0初始化
根据程序实现的功能和运行流程,首先定义一个SerialTool类,然后在其中进行初始化。初始化部分首先继承ui文件的Ui_Form父类,然后实例化一个串口ser,实例化两个定时器:timer_refresh用于在打开串口前刷新串口列表;timer_receive用于在打开串口后接收数据并显示在Receive Edit框中。最后初始化Open按钮按下触发事件和Send按钮按下出发事件。代码如下:
1 | class SerialTool(QtWidgets.QWidget, Ui_Form): |
Serial Tool V1.0相关方法实现
用于刷新串口的方法refresh_com。该方法用于在打开窗口前,实现每隔100ms获取COM信息并把端口号显示在COM下拉列表框中
1 | """Refresh the serial port when it is not open""" |
用于打开或关闭串口的Open按键方法open_and_close。该方法用于打开或关闭串口,当串口处于关闭的状态下点击按钮打开串口(按指定参数打开,关闭串口刷新定时器,打开接收数据定时器),串口处于打开的状态下点击按钮关闭串口(打开串口刷新定时器,关闭接收数据定时器),如果没有找到可用的串口就会提示错误信息
1 | """Open or close serial dispose""" |
发送数据方法send_data。该方法用于在打开串口后发送相关的数据,数据部分来源于输入列表框和微调框部分,并把数据整合一定的格式输出
1 | """Send data dispose""" |
接收数据方法receive_data。该方法用于接收串口数据,在串口打开的情况下每20ms读取一下串口的缓存,如果里面有数据就把它按格式(GBK格式,输出数据后空行)打印出来
1 | """Receive data dispose""" |
Clear按钮按下方法on_ClearPushButton_clicked。该方法是UI设计的按钮自带的方法,这里重写这个方法,所以在它上面要加上`@QtCore.pyqtSlot()`,用于清除接收文本编辑框
1 | """Clear PushButton Event dispose""" |
最后主函数直接实例化类然后调用显示
1 | if __name__ == "__main__": |
运行程序,实现效果(接一个USB转TTL模块到电脑,然后短接TXD和RXD):
PyQt5学习总结
通过使用PyQt5来实现Serial Tool V1.0后,得出如下几点总结
- 使用UI布局要跟自身所需功能结合选用组件,多查看组件的属性
- 编写代码前要有清晰的框架思维,最好先总结功能画出程序执行流程图
- 编写代码时多使用调试、try、print等方法查找并解决错误
UI Designer使用技巧
UI Designer是一个很强大的UI工具,可以快速实现UI设计,但是众多的组件也会让用户眼花缭乱,因此对于怎样用好UI Designer给出以下几点建议
- 每个组件都试着使用一下,查看它的相关属性
- 使用Ctrl+R查看组件在实际运行中的效果
- 查看组件在使用过程会有哪些事件产生
注:有些不理解的部分可以百度一下
代码的调试
PyCharm是一个很强大的代码编辑器,对于写python程序时很方便的一个IDE工具。PyCharm提供Debug功能,在每实现一个功能时最好Debug运行,如果出现错误的话在下面的信息窗口会给出错误信息
其次在编写代码时,对于不确定会不会出错的代码使用try语句,然后在except打印错误的信息,这样有助于开始发现错误并解决
最后,很多时候print函数时很有用的,它方便我们查看数据类型或者数据长度、或数据本身。比如接收到数据后,先print查看数据是怎样的,然后再对其进行格式化,在print重复到满意的效果,就可以删除print输出到其他设备上
其他
- 使用PyQt5开发的好处就是快,坏处就是工程文件会比较大(使用的库较多)
- 可以使用PyInstaller打包程序为exe
- PyQt官方网站:https://riverbankcomputing.com
- PySerial官方网站:https://pypi.org/project/pyserial/
- 多百度、多谷歌、多参考他人代码