PyQT——URAT串口调试助手(上位机界面)

页面实现效果:
main.py
python 复制代码
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
from ui.Ui_main_window import Ui_MainWindow
from views.serial_assist_widget import *


class MainWidget(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('自定义窗口标题')
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # 初始化UI界面
        self.init_ui()

    def init_ui(self):
        self.ui.tabWidget.addTab(SerialAssistWidget(self),"串口助手工具")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MainWidget()
    widget.show()
    sys.exit(app.exec_())
serial_assist_widget.py
python 复制代码
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import threading
sys.path.append('../')
from ui.Ui_serial_assist_widget import Ui_SerialAssistWidget
from views.serial_setting_dialog import SettingDialog
from drivers.driver_serial import *


class SerialAssistWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)       
        self.ui = Ui_SerialAssistWidget()
        self.ui.setupUi(self)

        self.sp = None
        
        # 设备列表默认为空
        self.device_port = []
        
        # 打开页面要扫描设备并显示
        self.refresh_device_slot()
        
        # 点击事件
        self.init_ui()
        
    def init_ui(self):
        # 波特率设置按钮信号与槽函数
        self.ui.btn_setting.clicked.connect(self.show_dialog_slot)
        # 设备刷新按钮信号与槽函数
        self.ui.btn_refersh.clicked.connect(self.refresh_device_slot)
        # 链接设备按钮信号与槽函数
        self.ui.btn_connect.clicked.connect(self.btn_connect_slot)
        # 发送数据按钮信号与槽函数
        self.ui.btn_send.clicked.connect(self.btn_send_slot)
        # 清空数据发送按钮信号与槽函数
        self.ui.pushButton_4.clicked.connect(self.clear_send_text)
        # 清空数据接受按钮信号与槽函数
        self.ui.pushButton_3.clicked.connect(self.clear_recv_text)
        
    
    def clear_send_text(self):
        self.ui.edit_send.clear()
        
    def clear_recv_text(self):
        self.ui.edit_recv.clear()
        
    def btn_send_slot(self):
        if not self.sp:
            QMessageBox.warning(self,"警告","请先链接设备")
            return
        send_text = self.ui.edit_send.toPlainText()
        if send_text == '':
            QMessageBox.warning(self,"警告","请输入要发送的内容")
            return
        self.sp.write(send_text.encode("utf-8"))
        # 在末尾必须加上换行符,否则不能立即收到
        self.sp.write(b'\n')
        
        
    def btn_connect_slot(self):
        # 如果设备未选择,则弹出警告提示
        if not self.device_port:
            QMessageBox.warning(self,"警告","请选择设备")
            return
        # 如果self.sp为真说明已经链接了,再次点击要断开链接
        if self.sp:
            self.sp.close()
            self.ui.btn_connect.setText("点击链接")
            self.ui.label_status.setPixmap(QPixmap(':/icon/disc'))
            self.sp=None
            return
            
        # 收集波特率和设备信息
        baud = self.ui.cb_baud.currentText()
        device_index = self.ui.cb_device.currentIndex()
        print(device_index,type(device_index))
        print(self.device_port)
        device_name = self.device_port[device_index][0]
        
        
        # 链接设备,成功则设置按钮状态与图标,失败则弹出警告
        self.sp = SerialDevice(device_name,int(baud))
        res, msg = self.sp.open()
        if not res:
            QMessageBox.warning(self,"警告",msg)
            return
        # 设置按钮状态与图标
        self.ui.btn_connect.setText("断开链接(已链接)")
        self.ui.label_status.setPixmap(QPixmap(':/icon/connect'))
        
        # 链接成功后就应开启子线程接受数据
        t = threading.Thread(target=self.recv_data,daemon=True)
        t.start()
        
    def recv_data(self):
        while True:
            data = self.sp.readline()
            # 去掉末尾的换行符
            data = data[:-1].decode('utf-8')
            self.ui.edit_recv.append(data)
            
    
    def refresh_device_slot(self):
        self.device_port = scan_serial_ports()
        print(self.device_port)
        if len(self.device_port)>0:
            for device,description in self.device_port:
                self.ui.cb_device.addItem(description)
            # 设置默认选择第一个
            self.ui.cb_device.setCurrentIndex(0)
        
    def show_dialog_slot(self):
        self.dialog = SettingDialog(self)
        self.dialog.signal.connect(self.dialog_slot)
        self.dialog.exec_()
        
    def dialog_slot(self,bt,data_bite):
        # 将信号中的bt同步到串口助手页面
        self.ui.cb_baud.setCurrentText(bt)
        


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = SerialAssistWidget()
    widget.show()
    sys.exit(app.exec_())
serial_setting_dialog.py
python 复制代码
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
sys.path.append("../")
from ui.Ui_serial_setting_dialog import Ui_Dialog


class SettingDialog(QDialog):
    setting_signal = pyqtSignal(str,str)
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('自定义窗口标题')
        # 初始化UI界面
        
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        
        self.init_ui()
        
        
    def btn_ok_slot(self):
        bt = self.ui.cb_bt.currentText()
        data = self.ui.cb_data.currentText()
        self.setting_signal.emit(bt,data)
        self.close()
        
        
    def init_ui(self):
        self.ui.btnOk.clicked.connect(self.btn_ok_slot)
        self.ui.btnCancel.clicked.connect(self.close)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = SettingDialog()
    widget.show()
    sys.exit(app.exec_())
相关推荐
萧鼎18 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸19 分钟前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农19 分钟前
Python 继承、多态、封装、抽象
开发语言·python
Python大数据分析@1 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树1 小时前
简单的签到程序 python笔记
笔记·python
Shy9604181 小时前
Bert完形填空
python·深度学习·bert
上海_彭彭1 小时前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element
zhongcx012 小时前
使用Python查找大文件的实用脚本
python
yyfhq2 小时前
sdnet
python
测试19983 小时前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试