目录
前言
使用pyqt5进行开发已经有一段时间了,再加上自己曾有过web开发的经历,将web端完善的架构搬进了pyqt5里进行使用,使开发效率得到了极大的提升,下面我从一个新的项目开始搭建pyqt5的框架。
快速创建流程及规范
按照该创建流程创建的项目,具有一定的规范性,在开发上具有较好的程序鲁棒性,本项目的框架基于web开发的框架进行搭建。
该部分默认您已经配置好pyqt5开发所需要的流程,即已经配置好了QtDesigner
那么接下来我们开始操作。
1.新建一个项目
新建项目,使用系统编译器(即您已经配置好pyqt5的编译器)
2.构建项目目录
我常用的项目目录如下
- main.py 主程序入口
- views 存放ui页面文件
- controller 用于继承views进行控制
- util 工具类
- static 静态资源,如图片
- serive 服务构建
- pojo 简单实体类
这也是web开发比较常见的架构,根据需要来添加目录,但是main.py/view/controller是一定要有的目录
3.打开QtDesigner新建一个页面
新建一个页面文件保存在views目录下,取名为Home.py
4.配置pyuic
pyuic是将ui文件转为py的文件的工具,只有转为py文件才能进行操作
Programs:pyuic5.exe所在的位置
Arguments:$FileName$ -o $FileNameWithoutExtension$.py -x
Working directory:$ContentRoot$\views
Working directory配置的前提是你的目录内也有views且views也是放ui文件的地方
5.转换ui文件
6.controller配置
controller用于页面的控制和页面内容的开发,将会继承py页面文件的内容进行开发,而不是在py页面文件上直接进行开发,因为直接使用py页面文件进行开发,每次ui文件修改后py页面文件都将被覆盖。
在Controller下创建一个py文件名为HomeCtroller.py
HomeController.py的内容直接copy以下代码
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QWidget, QApplication, QMessageBox, QLineEdit,QMainWindow
from views.home import Ui_MainWindow
class HomeController(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
# 往空的QWidget里面放置UI内容
self.setupUi(self)
self.initAttr()
self.initFun()
# 属性处理
def initAttr(self):
self.setWindowTitle("Title")
# 信号与槽绑定
def initFun(self):
pass
# 信号的实现
def something(self):
print("the button is here")
配置main.py
复制以下代码
from PyQt5 import QtWidgets
from controller.HomeController import HomeController
# 主程序入口
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = HomeController()
Form.show()
sys.exit(app.exec_())
以后在运行的时候就直接运行main.py就可以启动页面了
注意事项
关于串口通信
- 串口通过标志信号为转换为一个一个字节
- 每个字节转换为ASCII码
- ASCII码转换为16进制
- 接受16进制
- 16进制转换为10进制就是对应所需要的数据
在接受串口数据的时候,可能会涉及进制转换的问题,这里附上我的结局方案。
"""
该测试用于测试连接起与振动传感器之间的通讯关系,并且接受到振动数据
是一个基础的测试模块
"""
import serial
import sys
import time
# 十六进制显示
#将输入的二进制数据流转换为16进制
def hexShow(argv):
try:
result = ''
hLen = len(argv)
for i in range(hLen):
hvol = argv[i]
#不足两位,则补0,以16进制表示bytes数据流
hhex = '%02x' % hvol
result += hhex + ' '
return result
except Exception as e:
print("---异常---:", e)
if __name__ == '__main__':
#创建端口对象
ser =serial.Serial()
try:
#传入参数
ser = serial.Serial("COM1", 115200, timeout=0.01)
#连续发送信息
while 1:
#传入一个16进制数组
ser.write(bytes([0x01, 0x04, 0x01, 0xA1, 0x00, 0x17, 0xE0, 0x1A]))
#设置发送间隔时间为0.3s
time.sleep(0.3)
#打印输出的16进制信息
print(hexShow(ser.read_all()))
except Exception as e:
print('端口连接失败,错误原因:\n',e)
#关闭串口
sys.exit()
这段代码中我传入了一组数据,最后连接串口,接口到的数据如下。
然后就可以对照这通信协议来翻译这段数据的意思了
关于UI页面的制作
推荐大家最好不要半路出山,先把整个GUI的基础学完再去设计GUI,不然上手难度会很大,一直研究也会很累。
关于多线程的执行
在通过串口连续发送数据的时候,ui界面会无法操作,这是行为单线程处理的结果,串口通信没有结束的话,就一直无法操作,而如果你要是想一直获取数据 ,那么就会在界面中卡住,所以我们可以做的就是在运行定式发送信息的时候开多线程,并行运行以保证UI的流畅性与功能完整使用。
当然,多线程也有一种解决方法,即PyQt5提供了自带的QTimer工具,通过QTimer工具可以实现一些功能的周期性实现而不会影响用户体验,关于QTimer详细的使用大家可以SCDN一下。
友情提醒:能不开多线程尽量不要开多线程,因为分配一个新的线程需要比较大的资源开销,很多情况下有很多其他更好的解决方法来代替。