Я предполагаю, что под «выводом из интерпретатора» вы подразумеваете вывод, записанный в консоль или окно терминала, такой как вывод, полученный с помощью 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))
Теперь, в вашем графическом интерфейсе, установите экземпляр этого потока в 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()