我有一个使用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/