Skip to content

Instantly share code, notes, and snippets.

@epifanio
Created December 3, 2015 20:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save epifanio/e2c05dc517052ff6872a to your computer and use it in GitHub Desktop.
Save epifanio/e2c05dc517052ff6872a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Calling your Python functions with graphical controls"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We need to import a few functions from IPython."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import ipywidgets as widgets\n",
"from ipywidgets import interact, interactive, fixed"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's create a simple function."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def f(x):\n",
" print(\"%d^2=%d\" % (x, x*x))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3^2=9\n"
]
}
],
"source": [
"f(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To make our function interactive, we add the **decorator `@interact`**. The argument to `@interact` specifies the domain for the `x` argument. IPython understands that `(0, 10)` means *\"a slider with an integer ranging from 0 to 10\"*."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5^2=25\n"
]
}
],
"source": [
"@interact(x=(0, 10))\n",
"def f(x):\n",
" print(\"%d^2=%d\" % (x, x*x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can set a default value easily."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3^2=9\n"
]
}
],
"source": [
"@interact(x=(0, 10))\n",
"def f(x=3):\n",
" print(\"%d^2=%d\" % (x, x*x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Widget abbreviations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Other controls can be created easily:\n",
"* checkbox\n",
"* text area\n",
"* slider\n",
"* dropdown\n",
"\n",
"Here is a complete example."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"cos\n"
]
},
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f79015e0400>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"@interact(fun=('sin', 'cos', 'arctan'), # dropdown menu\n",
" title='my function', # text area\n",
" dashed=False, # checkbox\n",
" xscale=(.1, 100.)) # float slider\n",
"\n",
"def complex_plot(fun='sin', \n",
" title='sine', \n",
" dashed=False, \n",
" xscale=5.):\n",
" print(fun)\n",
" f = getattr(np, fun)\n",
" t = np.linspace(-xscale, +xscale, 1000)\n",
" s = '--' if dashed else '-'\n",
" \n",
" plt.plot(t, f(t), s, lw=3);\n",
" plt.xlim(-xscale, +xscale);\n",
" plt.title(title);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"IPython adopts the following conventions, called **widget abbreviations**.\n",
"\n",
"<table class=\"table table-condensed table-bordered\">\n",
" <tr><td><strong>Keyword argument</strong></td><td><strong>Widget</strong></td></tr><br> <tr><td><code>True</code> or <code>False</code></td><td>CheckboxWiget</td></tr><br> <tr><td><code>&#39;Hi there&#39;</code></td><td>TextareaWidget</td></tr>\n",
" <tr><td><code>value</code> or <code>(min,max)</code> or <code>(min,max,step)</code> if integers are passed</td><td>IntSliderWidget</td></tr>\n",
" <tr><td><code>value</code> or <code>(min,max)</code> or <code>(min,max,step)</code> if floats are passed</td><td>FloatSliderWidget</td></tr>\n",
" <tr><td><code>(&#39;orange&#39;,&#39;apple&#39;)</code> or <code>{&#39;one&#39;:1,&#39;two&#39;:2}</code></td><td>DropdownWidget</td></tr>\n",
"</table>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## More widgets"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For more fine-grained control, it is possible to specify widgets explicitly. A **widget** is just a graphical control like a dropdown list, a button, or a slider. Here is the list of all available widgets:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['DOMWidget', 'Widget']"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[widget for widget in dir(widgets) if widget.endswith('Widget')]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We're going to replace a few widgets: the checkbox by a toggle button, and the dropdown list by a sequence of radio buttons. The first step is to recover the widget instance created with `@interact`."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "TypeError",
"evalue": "getattr(): attribute name must be string",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-7-c4e8b9063d86>\u001b[0m in \u001b[0;36mcomplex_plot\u001b[1;34m(fun, title, dashed, xscale)\u001b[0m\n\u001b[0;32m 9\u001b[0m xscale=5.):\n\u001b[0;32m 10\u001b[0m \u001b[1;33m\u0001\u001b[0m\u0002\u0001\u001b[0m\u0002\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0mf\u0001\u001b[0m\u0002 \u001b[1;33m=\u0001\u001b[0m\u0002 \u001b[0mgetattr\u0001\u001b[0m\u0002\u001b[1;33m(\u0001\u001b[0m\u0002\u001b[0mnp\u0001\u001b[0m\u0002\u001b[1;33m,\u0001\u001b[0m\u0002 \u001b[0mfun\u0001\u001b[0m\u0002\u001b[1;33m)\u0001\u001b[0m\u0002\u001b[1;33m\u0001\u001b[0m\u0002\u0001\u001b[0m\u0002\n\u001b[0m\u001b[0;32m 12\u001b[0m \u001b[0mt\u0001\u001b[0m\u0002 \u001b[1;33m=\u0001\u001b[0m\u0002 \u001b[0mnp\u0001\u001b[0m\u0002\u001b[1;33m.\u0001\u001b[0m\u0002\u001b[0mlinspace\u0001\u001b[0m\u0002\u001b[1;33m(\u0001\u001b[0m\u0002\u001b[1;33m-\u0001\u001b[0m\u0002\u001b[0mxscale\u0001\u001b[0m\u0002\u001b[1;33m,\u0001\u001b[0m\u0002 \u001b[1;33m+\u0001\u001b[0m\u0002\u001b[0mxscale\u0001\u001b[0m\u0002\u001b[1;33m,\u0001\u001b[0m\u0002 \u001b[1;36m1000\u0001\u001b[0m\u0002\u001b[1;33m)\u0001\u001b[0m\u0002\u001b[1;33m\u0001\u001b[0m\u0002\u0001\u001b[0m\u0002\n\u001b[0;32m 13\u001b[0m \u001b[0ms\u0001\u001b[0m\u0002 \u001b[1;33m=\u0001\u001b[0m\u0002 \u001b[1;34m'--'\u0001\u001b[0m\u0002 \u001b[1;32mif\u0001\u001b[0m\u0002 \u001b[0mdashed\u0001\u001b[0m\u0002 \u001b[1;32melse\u0001\u001b[0m\u0002 \u001b[1;34m'-'\u0001\u001b[0m\u0002\u001b[1;33m\u0001\u001b[0m\u0002\u0001\u001b[0m\u0002\n",
"\u001b[1;31mTypeError\u001b[0m: getattr(): attribute name must be string"
]
}
],
"source": [
"interact(complex_plot,\n",
" title='my function',\n",
" xscale=(.1, 100.),\n",
" fun=widgets.RadioButtons(values=['sin', 'cos', 'arctan']),\n",
" dashed=widgets.ToggleButton(),);"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<function __main__.f>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"f"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This would also work with custom widgets."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## References\n",
"\n",
"* [IPython in depth tutorial](http://nbviewer.ipython.org/github/ipython/ipython-in-depth/blob/master/examples/Interactive%20Widgets/Using%20Interact.ipynb)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment