widget_output.py
78 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
r18953 | """Output class. | ||
Represents a widget that can be used to display output within the widget area. | ||||
""" | ||||
# Copyright (c) IPython Development Team. | ||||
# Distributed under the terms of the Modified BSD License. | ||||
from .widget import DOMWidget | ||||
import sys | ||||
from IPython.utils.traitlets import Unicode, List | ||||
from IPython.display import clear_output | ||||
Jonathan Frederic
|
r18960 | from IPython.testing.skipdoctest import skip_doctest | ||
Jonathan Frederic
|
r20073 | from IPython.kernel.zmq.session import Message | ||
Jonathan Frederic
|
r18953 | |||
Jonathan Frederic
|
r18960 | @skip_doctest | ||
Jonathan Frederic
|
r18953 | class Output(DOMWidget): | ||
Jonathan Frederic
|
r18960 | """Widget used as a context manager to display output. | ||
This widget can capture and display stdout, stderr, and rich output. To use | ||||
it, create an instance of it and display it. Then use it as a context | ||||
manager. Any output produced while in it's context will be captured and | ||||
displayed in it instead of the standard output area. | ||||
Example | ||||
from IPython.html import widgets | ||||
from IPython.display import display | ||||
out = widgets.Output() | ||||
display(out) | ||||
print('prints to output area') | ||||
with out: | ||||
print('prints to output widget')""" | ||||
Jonathan Frederic
|
r18953 | _view_name = Unicode('OutputView', sync=True) | ||
def clear_output(self, *pargs, **kwargs): | ||||
with self: | ||||
clear_output(*pargs, **kwargs) | ||||
def __enter__(self): | ||||
Jonathan Frederic
|
r20060 | """Called upon entering output widget context manager.""" | ||
Jonathan Frederic
|
r18953 | self._flush() | ||
Jonathan Frederic
|
r20060 | kernel = get_ipython().kernel | ||
session = kernel.session | ||||
send = session.send | ||||
self._original_send = send | ||||
self._session = session | ||||
Jonathan Frederic
|
r20072 | def send_hook(stream, msg_or_type, content=None, parent=None, ident=None, | ||
buffers=None, track=False, header=None, metadata=None): | ||||
# Handle both prebuild messages and unbuilt messages. | ||||
Jonathan Frederic
|
r20073 | if isinstance(msg_or_type, (Message, dict)): | ||
Jonathan Frederic
|
r20072 | msg_type = msg_or_type['msg_type'] | ||
Jonathan Frederic
|
r20073 | msg = dict(msg_or_type) | ||
Jonathan Frederic
|
r20060 | else: | ||
Jonathan Frederic
|
r20072 | msg_type = msg_or_type | ||
msg = session.msg(msg_type, content=content, parent=parent, | ||||
header=header, metadata=metadata) | ||||
# If this is a message type that we want to forward, forward it. | ||||
if stream is kernel.iopub_socket and msg_type in ['clear_output', 'stream', 'display_data']: | ||||
self.send(msg) | ||||
else: | ||||
Jonathan Frederic
|
r20074 | send(stream, msg, ident=ident, buffers=buffers, track=track) | ||
Jonathan Frederic
|
r20060 | |||
session.send = send_hook | ||||
Jonathan Frederic
|
r18953 | |||
def __exit__(self, exception_type, exception_value, traceback): | ||||
Jonathan Frederic
|
r20060 | """Called upon exiting output widget context manager.""" | ||
Jonathan Frederic
|
r18953 | self._flush() | ||
Jonathan Frederic
|
r20060 | self._session.send = self._original_send | ||
Jonathan Frederic
|
r18953 | |||
def _flush(self): | ||||
Jonathan Frederic
|
r20060 | """Flush stdout and stderr buffers.""" | ||
Jonathan Frederic
|
r18953 | sys.stdout.flush() | ||
sys.stderr.flush() | ||||