IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> PyQt5 学习记录(1) -> 正文阅读

[Python知识库]PyQt5 学习记录(1)

PyQt5 学习记录(1)


2022年1月7日

第一次写博客记录学习过程,目前自学了Python的一些基本知识同时也对Qt有一定的了解,打算通过学习PyQt5巩固和加深对Python以及Qt的了解。
第一个项目打算通过PyQt5实现一个简单的串口工具,实现串口数据的收发


安装PyQt5

  • 通过PowerShell输入指令
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): # 继承自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()

运行效果1

  • 为控件载入内容

需要获取电脑的串口信息同时添加波特率枚举到对应的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:])) 
        #考虑到存在COM10等串口号,不直接对字符串进行排序
        for i in portList : # 获取串口列表信息并完成遍历
            self.serialCombox.addItem(i.portName()) # 将串口名添加到串口下拉列表框
        self.baudCombox.addItems(["9600", "19200", "38400", "115200", "230400", "460800", "921600"])
        self.baudCombox.setCurrentIndex(3)

运行效果
运行效果2

  • 信号和槽

完成之后久开始对功能进行简单的实现了,这里需要用到信号和槽的功能,连接单击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

运行效果
运行效果3

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 13:57:17  更:2022-01-08 13:58:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:51:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码