PyQt5 学习记录(1)
2022年1月7日
第一次写博客记录学习过程,目前自学了Python的一些基本知识同时也对Qt有一定的了解,打算通过学习PyQt5巩固和加深对Python以及Qt的了解。 第一个项目打算通过PyQt5实现一个简单的串口工具,实现串口数据的收发
安装PyQt5
pip3 install PyQt5
- 国内直接安装访问比较慢,安装需要很长时间,可以通过国内镜像源快速安装
完整说明
pip3 install PyQt5 -i https://pypi.mirrors.ustc.edu.cn/simple/
开始研究使用
第一个程序打算实现一个界面,完成简单的串口枚举,并对串口完成打开关闭操作
程序需要用的的内容为QtCore、QtWidgets、QtSerialPort
from PyQt5.QtCore import (QCoreApplication, QIODevice)
from PyQt5.QtWidgets import*
from PyQt5.QtSerialPort import*
import sys
需要使用的控件为两个Combox(一个枚举波特率,一个枚举串口号),一个PushButton(打开关闭串口),一个TextBrowser(暂未实现功能,后续可能用于串口数据展示)主界面继承自QDialog。布局Combox和PushButton采用横向布局,整个横向部分和TextBrowser进行纵向布局
class serialPortTest(QDialog):
def __init__(self, parent=None):
super(serialPortTest, self).__init__(parent)
self.serialCombox = QComboBox()
self.baudCombox = QComboBox()
self.openSerialButton = QPushButton("Open serial")
self.dataBrowser = QTextBrowser()
layoutH = QHBoxLayout()
layoutH.addWidget(self.baudCombox)
layoutH.addWidget(self.serialCombox)
layoutH.addWidget(self.openSerialButton)
layoutV = QVBoxLayout()
layoutV.addLayout(layoutH)
layoutV.addWidget(self.dataBrowser)
self.setLayout(layoutV)
self.setWindowTitle('MySerialTool')
完成布局后,就可以运行看下效果了,添加下面的代码段后运行程序效果如图
def main():
app = QApplication(sys.argv)
myApp = serialPortTest()
myApp.show()
sys.exit(myApp.exec_())
if __name__ == "__main__":
main()
需要获取电脑的串口信息同时添加波特率枚举到对应的Combox该部分代码同样在初始化函数中处理完毕,添加如下代码
class serialPortTest(QDialog):
def __init__(self, parent=None):
for i in QSerialPortInfo.availablePorts() :
self.serialCombox.addItem(i.portName())
self.baudCombox.addItems(["9600", "19200", "38400", "115200", "230400", "460800", "921600"])
self.baudCombox.setCurrentIndex(3)
添加完成后,发现串口下拉框中串口名的顺序是乱的,需要对其进行排序,通过查找资料,python有sorted方法可以对列表进行排序,对上面的代码段修改后如下
class serialPortTest(QDialog):
def __init__(self, parent=None):
portList = QSerialPortInfo.availablePorts()
portList = sorted(portList,key = lambda x : eval(x.portName()[3:]))
for i in portList :
self.serialCombox.addItem(i.portName())
self.baudCombox.addItems(["9600", "19200", "38400", "115200", "230400", "460800", "921600"])
self.baudCombox.setCurrentIndex(3)
运行效果
完成之后久开始对功能进行简单的实现了,这里需要用到信号和槽的功能,连接单击PushButton的信号和对应的处理函数,参考资料后添加如下代码
class serialPortTest(QDialog):
def __init__(self, parent=None):
'''实列串口对象并设置初始化参数'''
self.serialObject = QSerialPort()
self.serialObject.setBaudRate(115200)
self.serialObject.setStopBits(1)
self.serialObject.setDataBits(8)
self.serialObject.setFlowControl(QSerialPort.FlowControl.HardwareControl)
self.openSerialButton.clicked.connect(self.__onClickedOpenButton)
def __onClickedOpenButton(self):
if self.serialObject.isOpen():
self.serialObject.close()
self.openSerialButton.setText("Open serial")
self.serialCombox.setEnabled(True)
self.baudCombox.setEnabled(True)
return
comName = self.serialCombox.currentText()
for i in QSerialPortInfo.availablePorts():
if i.portName() == comName:
self.serialObject.setPort(i)
self.serialObject.setBaudRate(int(self.baudCombox.currentText()))
if self.serialObject.open(QIODevice.OpenModeFlag.ReadWrite):
self.openSerialButton.setText("Close serial")
self.serialCombox.setEnabled(False)
self.baudCombox.setEnabled(False)
else:
msg = QMessageBox(QMessageBox.Icon.Warning, "warning", "Open the serial failed",QMessageBox.StandardButton.Ok)
msg.show()
msg.exec_()
break
运行效果
|