pyqt6 捕获错误并打印

问题

pyqt6里面的窗口,如何嵌套的多的话,深层的组件报错不会打印,而是直接退出程序,不方便开发

解决

在主运行文件里,指定sys.excepthook函数,让有错误第一时间打印出来,不用层层传递错误信息,避免被拦截

sys.exc_info():返回一个错误数据的元组,有兴趣的可以去看看
sys.excepthook:程序运行出现错误时会运行的函数,会将sys.exc_into()传入进去
traceback.print_exception():系统打印错误调用的函数,需要传递sys.exc_into()

from window.main_window import MainWindow
from PyQt6.QtWidgets import QApplication
import sys
import traceback


def handle_exception(*args, **kwargs):
    traceback.print_exception(*args)
    sys.exit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    sys.excepthook = handle_exception

    main_window = MainWindow()
    main_window.show()

    sys.exit(app.exec())

### PyQt6与UART通信集成 为了在Visual Studio Code (VSCode) 中使用PyQt6实现UART串口通信,开发者可以借助`pyserial`库来处理串口操作。PythonPyQt6框架用于构建图形用户界面(GUI),而`pyserial`则负责管理串口连接。 #### 安装依赖包 安装必要的软件包对于项目启动至关重要。通过命令行工具pip可轻松完成这些依赖项的安装: ```bash pip install pyqt6 pyserial ``` #### 创建基本GUI布局 创建一个简单的窗口应用程序作为基础结构,在此之上添加功能按钮和显示区域以便于交互控制以及数据展示。 ```python import sys from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QTextEdit, QLabel, QComboBox class SerialApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): layout = QVBoxLayout() label_port = QLabel('Select Port:') combo_ports = QComboBox() # 下拉菜单选择可用端口 btn_open_close = QPushButton('Open/Close') text_display = QTextEdit(readOnly=True) layout.addWidget(label_port) layout.addWidget(combo_ports) layout.addWidget(btn_open_close) layout.addWidget(text_display) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) ex = SerialApp() ex.show() sys.exit(app.exec()) ``` 上述代码片段定义了一个具有下拉列表、打开关闭按钮及只读文本框的基础窗体[^1]。 #### 实现串口收发逻辑 接下来引入实际的数据传输机制——即初始化并配置好串口号之后就可以发送接收指令了。这里假设已经选择了有效的COM端口,并且波特率设置为9600bps。 ```python import serial import threading # 假设SerialApp类已存在... def start_serial_thread(port_name='COM3', baudrate=9600): ser = None try: ser = serial.Serial(port_name, baudrate, timeout=1) while True: if not running_flag.is_set(): break line = ser.readline().decode('utf-8').strip() if line != '': print(f'Received: {line}') except Exception as e: print(e) finally: if isinstance(ser, serial.Serial) and ser.isOpen(): ser.close() running_flag = threading.Event() threading.Thread(target=start_serial_thread).start() ``` 这段脚本展示了如何在一个独立线程内持续监听来自指定串口的消息流,并将其打印出来。注意这里的异常捕获部分是为了确保即使遇到错误也能安全地释放资源[^2]。 #### 将两者结合起来 最后一步就是把前面提到的功能模块组合起来形成完整的解决方案。这涉及到事件绑定(比如点击“打开”按钮时触发相应的动作)、状态更新(当接收到新消息时刷新界面上的内容)等方面的工作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值