Skip to content

Instantly share code, notes, and snippets.

Created July 6, 2015 15:46
Show Gist options
  • Save anonymous/6b74b929d5b8663ce28e to your computer and use it in GitHub Desktop.
Save anonymous/6b74b929d5b8663ce28e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
":0: FutureWarning: IPython widgets are experimental and may change in the future.\n"
]
}
],
"source": [
"import uuid\n",
"import time\n",
"import IPython.html.widgets\n",
"\n",
"\n",
"class WidgetHistory:\n",
" \"\"\"\n",
" With a button click, save the state of all other widgets to a file.\n",
" Review past states using a slider.\n",
" \"\"\"\n",
" def __init__(self, history, widgets=None):\n",
" self._history = history\n",
" self._widgets = widgets\n",
" self._state_key = 'WIDGET_STATE'\n",
" \n",
" # History slider\n",
" self.slider = IPython.html.widgets.IntSlider()\n",
" self.slider.max = 0\n",
" self.slider.min = 0\n",
" self.slider.description = 'history'\n",
" self.slider.on_trait_change(self.load_state, 'value')\n",
" self._locate_beginning()\n",
"\n",
" # Save button\n",
" def save_callback(_):\n",
" return self.save_all_widgets()\n",
" \n",
" self.save_button = IPython.html.widgets.Button()\n",
" self.save_button.on_click(save_callback)\n",
" self.save_button.description = 'Save State'\n",
" \n",
" # Playback button\n",
" def play_callback(_):\n",
" return self.playback(1)\n",
" \n",
" self.play_button = IPython.html.widgets.Button()\n",
" self.play_button.on_click(play_callback)\n",
" self.play_button.description = 'Playback'\n",
"\n",
" # boxed group of widgets\n",
" self.box = IPython.html.widgets.HBox([self.slider, self.save_button, self.play_button])\n",
" \n",
" @property\n",
" def widgets(self):\n",
" if self._widgets is not None:\n",
" return self._widgets\n",
" else:\n",
" return IPython.html.widgets.Widget.__dict__['widgets']\n",
" \n",
" @widgets.setter\n",
" def widgets(self, val):\n",
" self._widgets = val\n",
" \n",
" def load_state(self, _):\n",
" state = self._history.past(self._state_key, -self.slider.value)\n",
" for model_id, widget in list(self.widgets.items()):\n",
" if model_id == self.slider.model_id:\n",
" # Don't manipulate the history widget itself, of course.\n",
" continue\n",
" if model_id not in state:\n",
" # No state has been saved for this widget at this point in\n",
" # history.\n",
" continue\n",
" for key, value in state[model_id].items():\n",
" setattr(widget, key, value)\n",
"\n",
" def save_all_widgets(self):\n",
" state = {}\n",
" for key, w in self.widgets.items():\n",
" state[key] = w.get_state()\n",
" if key == self.slider.model_id:\n",
" continue\n",
" self._history[self._state_key] = state\n",
" self._locate_beginning()\n",
" self.slider.value = 0\n",
" \n",
" def playback(self, delay, step=1):\n",
" while not (self.slider.value > -1):\n",
" self.slider.value += step\n",
" time.sleep(delay)\n",
" \n",
" def _locate_beginning(self):\n",
" while True:\n",
" try:\n",
" self._history.past(self._state_key, -self.slider.min + 1)\n",
" except ValueError:\n",
" break\n",
" except KeyError:\n",
" # no value self._state_key\n",
" break\n",
" else:\n",
" self.slider.min -= 1\n",
" self.slider.disabled = self.slider.min == 0"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import history\n",
"from IPython.display import display, HTML\n",
"from IPython.html.widgets import IntSlider\n",
"\n",
"h = history.History('my_widget_history.db')\n",
"wsh = WidgetHistory(h)\n",
"wsh.box"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"IntSlider(description='example', min=0, max=20, model_id='5e503da58c6644079f56cf9884e804e9')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "a"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.3"
},
"widgets_state": {
"18804a3c333f410f9e4cdd6b67661968": {
"model_module": null,
"model_name": "WidgetModel",
"state": {
"_css": [],
"_dom_classes": [],
"_view_module": "",
"_view_name": "FlexBoxView",
"align": "start",
"background_color": "",
"border_color": "",
"border_radius": "",
"border_style": "",
"border_width": "",
"box_style": "",
"children": [
"IPY_MODEL_3e632e91bfd94fb9b751d1095d8c8e32",
"IPY_MODEL_f8e617169bc844cba1b5cdffeeac92c0",
"IPY_MODEL_590fff8075d7496b8967dc26292fd03f"
],
"color": "",
"flex": 0,
"font_family": "",
"font_size": "",
"font_style": "",
"font_weight": "",
"height": "",
"margin": "",
"msg_throttle": 3,
"orientation": "horizontal",
"overflow_x": "",
"overflow_y": "",
"pack": "start",
"padding": "",
"version": 0,
"visible": true,
"width": ""
},
"views": [
1
]
},
"3e632e91bfd94fb9b751d1095d8c8e32": {
"model_module": null,
"model_name": "WidgetModel",
"state": {
"_css": [],
"_dom_classes": [],
"_range": false,
"_view_module": "",
"_view_name": "IntSliderView",
"background_color": "",
"border_color": "",
"border_radius": "",
"border_style": "",
"border_width": "",
"color": "",
"description": "history",
"disabled": false,
"font_family": "",
"font_size": "",
"font_style": "",
"font_weight": "",
"height": "",
"margin": "",
"max": 0,
"min": -18,
"msg_throttle": 3,
"orientation": "horizontal",
"padding": "",
"readout": true,
"slider_color": "",
"step": 1,
"value": 0,
"version": 0,
"visible": true,
"width": ""
},
"views": []
},
"590fff8075d7496b8967dc26292fd03f": {
"model_module": null,
"model_name": "WidgetModel",
"state": {
"_css": [],
"_dom_classes": [],
"_view_module": "",
"_view_name": "ButtonView",
"background_color": "",
"border_color": "",
"border_radius": "",
"border_style": "",
"border_width": "",
"button_style": "",
"color": "",
"description": "Playback",
"disabled": false,
"font_family": "",
"font_size": "",
"font_style": "",
"font_weight": "",
"height": "",
"icon": "",
"margin": "",
"msg_throttle": 3,
"padding": "",
"tooltip": "",
"version": 0,
"visible": true,
"width": ""
},
"views": []
},
"5e503da58c6644079f56cf9884e804e9": {
"model_module": null,
"model_name": "WidgetModel",
"state": {
"_css": [],
"_dom_classes": [],
"_range": false,
"_view_module": "",
"_view_name": "IntSliderView",
"background_color": "",
"border_color": "",
"border_radius": "",
"border_style": "",
"border_width": "",
"color": "",
"description": "example",
"disabled": false,
"font_family": "",
"font_size": "",
"font_style": "",
"font_weight": "",
"height": "",
"margin": "",
"max": 20,
"min": 0,
"msg_throttle": 3,
"orientation": "horizontal",
"padding": "",
"readout": true,
"slider_color": "",
"step": 1,
"value": 0,
"version": 0,
"visible": true,
"width": ""
},
"views": [
2
]
},
"f8e617169bc844cba1b5cdffeeac92c0": {
"model_module": null,
"model_name": "WidgetModel",
"state": {
"_css": [],
"_dom_classes": [],
"_view_module": "",
"_view_name": "ButtonView",
"background_color": "",
"border_color": "",
"border_radius": "",
"border_style": "",
"border_width": "",
"button_style": "",
"color": "",
"description": "Save State",
"disabled": false,
"font_family": "",
"font_size": "",
"font_style": "",
"font_weight": "",
"height": "",
"icon": "",
"margin": "",
"msg_throttle": 3,
"padding": "",
"tooltip": "",
"version": 0,
"visible": true,
"width": ""
},
"views": []
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment