python - 如何捕获 Python 解释器的输出并在 Text 小部件中显示?

标签 python python-3.x pyqt

我有一个带有 PyQt 的 Python 程序,旨在在 Windows 上运行。 该程序进行大量操作并打印大量信息。 但是因为我想卡住它并且不希望出现提示屏幕,所以我希望所有这些信息都出现在主应用程序中,在 QTextEdit 左右。 我怎样才能使程序工作,以便它从解释器获取输出并同时在 textEdit 上显示它,就像它在真正的解释器上一样?

最佳答案

我假设“解释器的输出”是指写入控制台或终端窗口的输出,例如使用 print() 生成的输出。

Python 产生的所有控制台输出都被写入程序的输出流 sys.stdout(正常输出)和 sys.stderr(错误输出,例如异常回溯) .这些是类似文件的对象。

您可以将这些流替换为您自己的类似文件的对象。您的所有自定义实现必须提供一个 write(text) 函数。通过提供您自己的实现,您可以将所有输出转发到您的小部件:

class MyStream(object):
    def write(self, text):
        # Add text to a QTextEdit...

sys.stdout = MyStream()
sys.stderr = MyStream()

如果您需要重置这些流,它们仍可用作 sys.__stdout__sys.__stderr__:

sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

更新

这是 PyQt4 的一些工作代码。首先定义一个流,用 Qt 信号报告写入它的数据:

from PyQt4 import QtCore

class EmittingStream(QtCore.QObject):

    textWritten = QtCore.pyqtSignal(str)

    def write(self, text):
        self.textWritten.emit(str(text))

现在,在您的 GUI 中,将此流的实例安装到 sys.stdout 并将 textWritten 信号连接到将文本写入 的插槽QTextEdit:

# Within your main window class...

def __init__(self, parent=None, **kwargs):
    # ...

    # Install the custom output stream
    sys.stdout = EmittingStream(textWritten=self.normalOutputWritten)

def __del__(self):
    # Restore sys.stdout
    sys.stdout = sys.__stdout__

def normalOutputWritten(self, text):
    """Append text to the QTextEdit."""
    # Maybe QTextEdit.append() works as well, but this is how I do it:
    cursor = self.textEdit.textCursor()
    cursor.movePosition(QtGui.QTextCursor.End)
    cursor.insertText(text)
    self.textEdit.setTextCursor(cursor)
    self.textEdit.ensureCursorVisible()

关于python - 如何捕获 Python 解释器的输出并在 Text 小部件中显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8356336/

相关文章:

python - 通过 pyodbc 连接到 Azure SQL 数据库

python-3.x - 使用 tkinter OOP 安排事件顺序

python - 终止 PyQt 应用程序

python - Phonon:视频播放后如何清屏

Python - 在图中寻找模式

python - 如何在 scikit-learn 下绘制拟合高斯混合模型的概率密度函数?

python - PyAudio 试图使用 JACK

python - 在字符串上使用 .translate() 去除数字 [Python 3]

python-3.x - Keras 二元分类将输出压缩为 0/1

python - QWidget::setLayout:尝试在 ProgramWindow ""上设置 QLayout "",该窗口已经有布局