PyQt5 QTextBrowser串口终端实现时间戳循环行同位置覆盖不换行
PyQt5 串口终端时间戳行同屏刷新实现方案
下面是修改后的可用代码:
import re from PyQt5.QtGui import QTextCursor # 其他代码不变,仅修改read_serial函数即可 def read_serial(self): b = bytes(self.serialport.readAll()) try: read_all = b.decode("utf-8") # 校验当前读取内容是否为带时间戳的刷新行 timestamp_pattern = r'^\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}' is_timestamp_line = re.match(timestamp_pattern, read_all.strip()) is not None if is_timestamp_line: # 提取终端最后一行内容做对比 all_text = self.Terminal.toPlainText() last_line = all_text.split("\n")[-1] if all_text else "" # 去除时间戳后对比核心内容 read_content = re.sub(timestamp_pattern, "", read_all.strip()) last_content = re.sub(timestamp_pattern, "", last_line.strip()) if read_content == last_content: # 核心内容一致则删除上一行旧记录 cursor = self.Terminal.textCursor() cursor.movePosition(QTextCursor.End) cursor.movePosition(QTextCursor.StartOfLine, QTextCursor.KeepAnchor) cursor.removeSelectedText() self.Terminal.setTextCursor(cursor) # 插入最新内容 self.Terminal.moveCursor(QTextCursor.End) self.Terminal.insertPlainText(read_all) # 可选优化:仅当滚动条在最底部时自动滚动,不干扰用户查看历史日志 scroll_bar = self.Terminal.verticalScrollBar() if scroll_bar.value() == scroll_bar.maximum(): scroll_bar.setValue(scroll_bar.maximum()) except UnicodeDecodeError: read_all = str(b)[2:-1] self.Terminal.moveCursor(QTextCursor.End) self.Terminal.insertPlainText(read_all)
核心修改说明
- 新增行首时间戳匹配规则,只有符合格式的日志行才会触发替换逻辑,不会误删正常的指令返回内容
- 对比内容前统一去除首尾空白字符,避免换行、回车符干扰匹配结果,保证重复行判断准确
- 优化光标操作逻辑,删除旧行后直接插入新内容,不会产生多余空行,视觉上表现为同一行实时刷新
- 新增滚动条智能锚定逻辑,用户查看历史日志时不会被自动刷新的内容打断
如果后续设备调整了时间戳输出格式,仅需修改timestamp_pattern的正则规则即可适配。
内容的提问来源于stack exchange,提问作者user16794957
相关产品推荐
相关产品推荐

