在 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,1,1)

        self.console = MyConsole()
        self.layout.addWidget(self.console,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)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...