python - 在 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)
解决方案
推荐阅读
- clojure - 如何在 Clojure 中实现并行逻辑或提前终止
- c# - 在 ASP.NET Core API 中验证格式无效的值
- python - 为什么这段代码会生成多个文件?我想要 1 个包含所有条目的文件
- corda - 我是否能够序列化 Transaction Builder 以将其发送给另一方?
- java - BluetoothAdapter.getBondedDevices 虽然已配对但返回零设备,为什么?
- c++ - 从 clang-tidy 分析中排除头文件
- java - AWS 网络负载均衡器 (NLB) 是否支持 ALPN?
- mocha.js - 如何在 Mocha 测试中添加自定义成功消息?
- xml - 在 VB6 中替换 XML 节点中的值
- vue.js - Vue 中的 Matomo 标签管理器实现