from PyQt6.QtWidgets import QWidget, QPlainTextEdit from PyQt6.QtCore import QTimer, QThread, pyqtSignal import queue class RichLogThread(QThread): def __init__(self, parent=None): super().__init__(parent) self.logQueue = queue.Queue() self.maxLines = 5000 self.logLines = [] def run(self): while True: if not self.logQueue.empty(): logData = self.logQueue.get() self.logLines.append(logData) if len(self.logLines) > self.maxLines: self.logLines.pop(0) QThread.usleep(1) class RichLogForm(QWidget): def __init__(self, parent=None): super().__init__(parent) self.ui = QPlainTextEdit(self) self.ui.setReadOnly(True) self.timer = QTimer() self.logThread = RichLogThread() self.timer.timeout.connect(self.updateLogDisplay) self.timer.start(100) self.logThread.start() def addLog(self, logData): self.logThread.logQueue.put(logData) def updateLogDisplay(self): if self.logThread.logLines: self.ui.appendHtml("".join(self.logThread.logLines)) self.logThread.logLines = []