问题描述
我试图在 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 (将#修改为@)