首页 > 解决方案 > 在 QPlainTextEdit 中打印控制台输出

问题描述

我试图在 PyQt5 的 QPlainTextEdit 小部件中显示所有控制台输出消息(如打印和错误)。我知道那里有很多类似的问题,并且自 24 小时以来我已经浏览了所有这些问题,但仍然找不到如何进行这项工作。

下面是我的代码,由一个带有一个 QPushButton 和一个 QPlainTextEdit 的简单小部件组成,我希望用单击 QPushButton 时生成的实时控制台输出填充 QPlainTextEdit 小部件。

class MyWidget1(QWidget):
    def __init__(self):
        super().__init__()
        self.initWidgets()

    def initWidgets(self):
        self.layout = QGridLayout()
        self.setLayout(self.layout)

        self.button = QPushButton("Run")
        self.button.clicked.connect(self.button_clicked)
        self.layout.addWidget(self.button, 0, 0, 1, 1)

        self.console = MyConsole()
        self.layout.addWidget(self.console, 1, 0, 1, 1)

        self.process = ProcessOutputReader()
        self.process.produce_output.connect(self.console.append_output)

    def button_clicked(self):
        long_function_with_multiple_operations_and_print_output_that_I_want_to_display_in_the_MyConsole_widget()


class MyConsole(QPlainTextEdit):
    def __init__(self, parent=None):
        super().__init__(parent=parent)

        self.setReadOnly(True)
        self._cursor_output = self.textCursor()

    @pyqtSlot(str)
    def append_output(self, text):
        self._cursor_output.insertText(text)
        self.scroll_to_last_line()

    def scroll_to_last_line(self):
        cursor = self.textCursor()
        cursor.movePosition(QTextCursor.End)
        cursor.movePosition(QTextCursor.Up if cursor.atBlockStart() else QTextCursor.StartOfLine)
        self.setTextCursor(cursor)


class ProcessOutputReader(QProcess):
    produce_output = pyqtSignal(str)

    def __init__(self, parent=None):
        super().__init__(parent=parent)

        self.setProcessChannelMode(QProcess.MergedChannels)
        codec = QTextCodec.codecForLocale()
        self._decoder_stdout = codec.makeDecoder()
        self.readyReadStandardOutput.connect(self._ready_read_standard_output)

    @pyqtSlot()
    def _ready_read_standard_output(self):
        raw_bytes = self.readAllStandardOutput()
        text = self._decoder_stdout.toUnicode(raw_bytes)
        self.produce_output.emit(text)

标签: pythonconsolepyqt5qprocessqplaintextedit

解决方案


推荐阅读