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

pxiryf3j  于 7个月前  发布在  Python
关注(0)|答案(5)|浏览(68)

我有一个程序在Python与PyQt,设计运行在Windows上.这个程序使大量的操作和打印大量的信息.但我想冻结它,不希望提示屏幕出现,我希望所有的信息出现在主应用程序,在一个QTextEdit左右。我如何使程序工作,使它得到输出从解释器,并显示在textEdit在同一时间,就像在真实的翻译器上一样

jtw3ybtb

jtw3ybtb1#

不幸的是,这个例子不适用于PySide。它给出了以下错误:

sys.stdout = EmittingStream(textWritten=self.write2Console)
AttributeError: 'textWritten()' is not a Qt property or a signal

字符串
我们需要进行以下更改以使其与PySide一起使用:

sys.stdout = EmittingStream()
self.connect(sys.stdout,QtCore.SIGNAL('textWritten(QString)'),self.write2Console)

dtcbnfnu

dtcbnfnu2#

我建议你使用日志库。http://docs.python.org/library/logging.html你可以编写自己的日志处理程序来与QTextEdit通信。这里有一个很好的教程可以让你开始:http://pantburk.info/?blog=77

o7jaxewo

o7jaxewo3#

不久前,我发布了一些关于PySide的终端应用程序的东西,比如PySide中的终端应用程序。如果你正在看PyQt,那么也检查一下PySide。它们基本上是一样的,除了许可证和语法上的一些差异。

bxgwgixi

bxgwgixi4#

感谢Ferdinand和Tommy。我已经发布了我的PySide6新窗口解决方案,因为这个线程经常出现在搜索中。当我有一个QThread在后台做一堆事情时,我想创建一个“加载”窗口。我在启动线程时创建这个窗口,然后在线程完成时连接。close()。我从不同的SO Q&答:我可以从Windows终端运行我的GUI,在终端中看到通常的stdout,调用我的加载线程函数,窗口弹出,stdout转到窗口,然后当它完成时,窗口关闭,stdout返回到终端。

class StdOutWindow(QtWidgets.QWidget):
    def __init__(self):
        super(StdOutWindow, self).__init__()
        layout = QtWidgets.QVBoxLayout()
        self.setWindowTitle('Loading Data')
        self.txt_edit = QtWidgets.QTextEdit()
        layout.addWidget(self.txt_edit)
        self.setLayout(layout)
        self.setMinimumSize(600, 300)

        sys.stdout = EmittingStream()
        sys.stdout.text_written.connect(self.normal_output_written)

    def closeEvent(self, event: QtGui.QCloseEvent) -> None:
        sys.stdout = sys.__stdout__
        event.accept()

    def normal_output_written(self, text):
        cursor = self.txt_edit.textCursor()
        cursor.movePosition(QtGui.QTextCursor.End)
        cursor.insertText(text)
        self.txt_edit.setTextCursor(cursor)
        self.txt_edit.ensureCursorVisible()

class EmittingStream(QtCore.QObject):
    text_written = QtCore.Signal(str)

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

字符串

yqkkidmi

yqkkidmi5#

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

相关问题