为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUWWW 2019-11-29 15:38:30
我有一个使用PyQt的Python程序,旨在在Windows上运行。该程序进行了大量操作,并打印了大量信息。但是,由于我想冻结它,并且不希望出现提示屏幕,所以我希望所有这些信息都出现在主应用程序中,例如QTextEdit中。我如何使程序正常工作,以便它从解释器获取输出,并同时在textEdit上显示它,就像在真正的解释器上一样?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

我假设“来自解释器的输出”是指写入控制台或终端窗口的输出,例如使用产生的输出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()


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 920 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信