import panel as pn import sys from panel.pane.markup import DivPaneBase from panel.widgets.base import CompositeWidget from html import escape class TerminalReal(DivPaneBase): # Priority is dependent on the data type priority = None _rename = {'object': 'text', 'value':'tags'} _rerender_params = ['object'] def __init__(self, object=None, **params): object = """
""" super(TerminalReal, self).__init__(object=object, **params) @classmethod def applies(cls, obj): return None def _get_properties(self): properties = super(TerminalReal, self)._get_properties() text = '' if self.object is None else self.object return dict(properties, text=escape(text)) class Terminal(CompositeWidget): def __init__(self, **params): super(Terminal, self).__init__(**params) self.term = TerminalReal(**params) self.html_tmp = pn.pane.HTML(""" """) self._composite[:] = [ self.term, self.html_tmp ] code = """ if (source.text.length > 0) { var aux = JSON.parse(JSON.stringify(source.text)); $ptty.echo(aux, false) }; """ self.html_tmp.jslink(self.term, code={'object':code}) def write(self, arg0): import time self.html_tmp.object = arg0 self.html_tmp.object = '' pn.extension('plotly','terminal' ) react = pn.template.MaterialTemplate(title='Terminal') pn.config.sizing_mode = 'stretch_width' freq = pn.widgets.Button(name='Click me', button_type='primary') btn = pn.widgets.Button(name='Quit') btn1 = pn.widgets.Button(name='Start') def b(event): sys.exit() btn.on_click(b) term = Terminal(sizing_mode='fixed', height=650, width=1000) react.main.append( pn.Column(term) ) def kk(event): import time for i in range(500): term.write(str(i)) time.sleep(0.0001) btn1.on_click(kk) react.sidebar.append( pn.Column(freq, btn, btn1) ) react.servable()