jon*_*epp 22 python pyqt python-3.x
我有一个使用PyQt的Python程序,旨在在Windows上运行.该程序进行了大量操作并打印了大量信息.但是,由于我想要冻结它并且不希望出现提示屏幕,我希望所有信息都显示在主应用程序中,在QTextEdit中.我如何使程序工作,以便从解释器获取输出并同时在textEdit上显示它,就像在真正的解释器上一样?
Fer*_*yer 38
我假设"解释器的输出"是指写入控制台或终端窗口的输出,例如使用的输出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()
Run Code Online (Sandbox Code Playgroud)
如果您需要重置这些流,它们仍可用作sys.__stdout__和sys.__stderr__:
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
Run Code Online (Sandbox Code Playgroud)
更新
这是PyQt4的一些工作代码.首先定义一个流,该流报告使用Qt信号写入的数据:
from PyQt4 import QtCore
class EmittingStream(QtCore.QObject):
textWritten = QtCore.pyqtSignal(str)
def write(self, text):
self.textWritten.emit(str(text))
Run Code Online (Sandbox Code Playgroud)
现在,在您的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()
Run Code Online (Sandbox Code Playgroud)
小智 5
不幸的是,该示例不适用于PySide。它给出以下错误:
sys.stdout = EmittingStream(textWritten=self.write2Console)
AttributeError: 'textWritten()' is not a Qt property or a signal
Run Code Online (Sandbox Code Playgroud)
我们需要进行以下更改才能使其与PySide一起使用:
sys.stdout = EmittingStream()
self.connect(sys.stdout,QtCore.SIGNAL('textWritten(QString)'),self.write2Console)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24427 次 |
| 最近记录: |