diff --git a/IPython/html/widgets/interact.py b/IPython/html/widgets/interact.py index b677364e1..18ab6647f 100644 --- a/IPython/html/widgets/interact.py +++ b/IPython/html/widgets/interact.py @@ -13,8 +13,8 @@ # Imports #----------------------------------------------------------------------------- -from IPython.html.widgets import (Widget, StringWidget, - FloatRangeWidget, IntRangeWidget, BoolWidget, SelectionWidget, +from IPython.html.widgets import (Widget, TextBoxWidget, + FloatSliderWidget, IntSliderWidget, CheckBoxWidget, DropdownWidget, ContainerWidget) from IPython.display import display, clear_output from IPython.utils.py3compat import string_types, unicode_type @@ -41,38 +41,38 @@ def _min_max_value(o): def _widget_abbrev(o): if isinstance(o, string_types): - return StringWidget(value=unicode_type(o)) + return TextBoxWidget(value=unicode_type(o)) elif isinstance(o, dict): values = [unicode_type(k) for k in o] - w = SelectionWidget(value=values[0], values=values) + w = DropdownWidget(value=values[0], values=values) w.actual_values = o return w # Special case float and int == 0.0 # get_range(value): elif isinstance(o, bool): - return BoolWidget(value=o) + return CheckBoxWidget(value=o) elif isinstance(o, float): - return FloatRangeWidget(value=o, min=-o, max=3.0*o) + return FloatSliderWidget(value=o, min=-o, max=3.0*o) elif isinstance(o, int): - return IntRangeWidget(value=o, min=-o, max=3*o) + return IntSliderWidget(value=o, min=-o, max=3*o) if isinstance(o, (list, tuple)): if _matches(o, (int, int)): min, max, value = _min_max_value(o) - return IntRangeWidget(value=int(value), min=min, max=max) + return IntSliderWidget(value=int(value), min=min, max=max) elif _matches(o, (int, int, int)): min, max, value = _min_max_value(o) - return IntRangeWidget(value=int(value), min=min, max=max, step=o[2]) + return IntSliderWidget(value=int(value), min=min, max=max, step=o[2]) elif _matches(o, (float, float)): min, max, value = _min_max_value(o) - return FloatRangeWidget(value=value, min=min, max=max) + return FloatSliderWidget(value=value, min=min, max=max) elif _matches(o, (float, float, float)): min, max, value = _min_max_value(o) - return FloatRangeWidget(value=value, min=min, max=max, step=o[2]) + return FloatSliderWidget(value=value, min=min, max=max, step=o[2]) elif _matches(o, (float, float, int)): min, max, value = _min_max_value(o) - return FloatRangeWidget(value=value, min=min, max=max, step=float(o[2])) + return FloatSliderWidget(value=value, min=min, max=max, step=float(o[2])) elif all(isinstance(x, string_types) for x in o): - return SelectionWidget(value=unicode_type(o[0]), + return DropdownWidget(value=unicode_type(o[0]), values=[unicode_type(k) for k in o]) @@ -93,9 +93,9 @@ def interactive(f, **kwargs): if widget is None: raise ValueError("Object cannot be transformed to a Widget") widgets.append((key,widget)) - widget.parent = container widgets.sort(key=lambda e: e[1].__class__.__name__) - + container.children = [e[1] for e in widgets] + # Build the callback def call_f(name, old, new): actual_kwargs = {} diff --git a/examples/widgets/Interact.ipynb b/examples/widgets/Interact.ipynb index 2f485d884..1482b6061 100644 --- a/examples/widgets/Interact.ipynb +++ b/examples/widgets/Interact.ipynb @@ -30,7 +30,16 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "prompt_number": 1 }, { "cell_type": "code", @@ -42,7 +51,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": 2 }, { "cell_type": "heading", @@ -72,7 +82,8 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [], + "prompt_number": 3 }, { "cell_type": "code", @@ -82,7 +93,23 @@ ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [ + { + "html": [ + "

Arguments:

\n", + "\n", + "\n", + "\n", + "
a10
cTrue
bHi There
" + ], + "metadata": {}, + "output_type": "display_data", + "text": [ + "" + ] + } + ], + "prompt_number": 4 }, { "cell_type": "markdown", @@ -98,15 +125,115 @@ "interact(show_args,\n", " Temp=(0,10),\n", " Current=(0.,10.,0.01),\n", - " z=(True,False),\n", + " z=True,\n", " Text=u'Type here!',\n", " Algorithm=['This','That','Other'],\n", - " a=widgets.FloatRangeWidget(min=-10.0, max=10.0, step=0.1, value=5.0)\n", + " a=widgets.FloatSliderWidget(min=-10.0, max=10.0, step=0.1, value=5.0)\n", " )" ], "language": "python", "metadata": {}, - "outputs": [] + "outputs": [ + { + "html": [ + "

Arguments:

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
a5.0
AlgorithmThis
Temp5
TextType here!
Current5.0
zTrue
" + ], + "metadata": {}, + "output_type": "display_data", + "text": [ + "" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "%debug" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "> \u001b[0;32m/Users/bgranger/Documents/Computing/IPython/code/ipython/IPython/html/widgets/interact.py\u001b[0m(38)\u001b[0;36m_min_max_value\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m 37 \u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mmax\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mmin\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m---> 38 \u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'max must be greater than min: (min={0}, max={1})'\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\u001b[0;32m 39 \u001b[0;31m \u001b[0mvalue\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmin\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mabs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> print o\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "(True, False)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> print min, max\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "True False\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "stream": "stdout", + "text": [ + "ipdb> q\n" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "isinstance(10, bool)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 8, + "text": [ + "False" + ] + } + ], + "prompt_number": 8 }, { "cell_type": "markdown",