Source code for andes.utils.widgets

"""
Support for Jupyter widgets.

Please manually install the following dependencies:

- ipywidgets
- ipysheet

If you are using JupyterLab, do

.. code-block :: bash

    jupyter labextension install @jupyter-widgets/jupyterlab-manager

"""

from collections import OrderedDict

try:
    import ipywidgets as widgets
    from ipywidgets import HBox, VBox
    from IPython.display import display, HTML
except ImportError:
    pass


[docs]def edit_system(system): """ Edit a loaded ANDES System with ipywidgets. """ group_models = OrderedDict() # works with models with devices only model_tabs = dict() for group_name, instances in system.groups.items(): model_names = list(instances.models.keys()) exist_models = [mname for mname in model_names if system.models[mname].n] if len(exist_models): group_models[group_name] = exist_models for m in group_models[group_name]: model_tabs[m] = edit_sheet(system, m) # inner tabs group_table = OrderedDict() for group_name in group_models: model_names = group_models[group_name] group_table[group_name] = widgets.Tab() group_table[group_name].titles = group_models[group_name] # appears not working group_table[group_name].children = [model_tabs[m] for m in model_names] for ii in range(len(model_names)): group_table[group_name].set_title(ii, group_models[group_name][ii]) # outer tabs sys_tab = widgets.Tab() sys_tab.titles = list(group_models.keys()) sys_tab.children = list(group_table.values()) for ii in range(len(group_models)): sys_tab.set_title(ii, sys_tab.titles[ii]) return sys_tab
[docs]def edit_sheet(system, model: str): """ Use ipysheet to edit parameters of one model. """ sh = system.to_ipysheet(model, vin=True) header = widgets.Output() output = widgets.Output() button_upd = widgets.Button(description="Update") button_upd.on_click(on_update) button_upd.system = system button_upd.model = model button_upd.sheet = sh button_upd.output = output button_close = widgets.Button(description="Close") button_close.on_click(on_close) button_close.objects = [header, sh, button_upd, button_close, output] hbox = HBox((button_upd, button_close)) ret = VBox((header, sh, hbox, output)) return ret
[docs]def on_update(b): """ Callback for the Update button. Sets new parameters back to System. """ with b.output: b.system.from_ipysheet(b.model, b.sheet) if not hasattr(b, "label"): label = display(HTML("%s: parameter update was successful." % b.model), display_id=True) b.label = label else: b.label.update(HTML("%s: parameter update was successful." % b.model))
[docs]def on_close(b): """ Callback for the Close botton. Closes ipywidget objects. """ for item in b.objects: item.close()