Widget Basics.ipynb
445 lines
| 8.7 KiB
| text/plain
|
TextLexer
Jonathan Frederic
|
r14323 | { | ||
Min RK
|
r18669 | "cells": [ | ||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"[Index](Index.ipynb) - [Next](Widget List.ipynb)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"# Simple Widget Introduction" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"## What are widgets?" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"Widgets are elements that exists in both the front-end and the back-end.\n", | ||||
"\n", | ||||
"![Kernel & front-end diagram](../images/FrontendKernel.png)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"## What can they be used for?" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"You can use widgets to build **interactive GUIs** for your notebooks. \n", | ||||
"You can also use widgets to **synchronize stateful and stateless information** between Python and JavaScript." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"## Using widgets " | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"To use the widget framework, you need to **import `IPython.html.widgets`**." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"from IPython.html.widgets import *" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"### repr" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"Widgets have their own display `repr` which allows them to be displayed using IPython's display framework. Constructing and returning an `IntSlider` automatically displays the widget (as seen below). Widgets are **displayed inside the `widget area`**, which sits between the code cell and output. **You can hide all of the widgets** in the `widget area` by clicking the grey *x* in the margin." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"IntSlider()" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"### display()" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"You can also explicitly display the widget using `display(...)`." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"from IPython.display import display\n", | ||||
"w = IntSlider()\n", | ||||
"display(w)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"### Multiple display() calls" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"If you display the same widget twice, the displayed instances in the front-end **will remain in sync** with each other." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"display(w)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"## Why does displaying the same widget twice work?" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"Widgets are **represented in the back-end by a single object**. Each time a widget is displayed, **a new representation** of that same object is created in the front-end. These representations are called **views**.\n", | ||||
"\n", | ||||
"![Kernel & front-end diagram](images/WidgetModelView.png)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"### Closing widgets" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"You can close a widget by calling its `close()` method." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"display(w)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"w.close()" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"## Widget properties" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"All of the IPython widgets **share a similar naming scheme**. To read the value of a widget, you can query its `value` property." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"w = IntSlider()\n", | ||||
"display(w)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"w.value" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"Similarly, to set a widget's value, you can set its `value` property." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"w.value = 100" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"### Keys" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"In addition to `value`, most widgets share `keys`, `description`, `disabled`, and `visible`. To see the entire list of synchronized, stateful properties, of any specific widget, you can **query the `keys` property**." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"w.keys" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"### Shorthand for setting the initial values of widget properties" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"While creating a widget, you can set some or all of the initial values of that widget by **defining them as keyword arguments in the widget's constructor** (as seen below)." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"Text(value='Hello World!', disabled=True)" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"## Linking two similar widgets" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"If you need to display the same value two different ways, you'll have to use two different widgets. Instead of **attempting to manually synchronize the values** of the two widgets, you can use the `traitlet` `link` function **to link two properties together**. Below, the values of three widgets are linked together." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"from IPython.utils.traitlets import link\n", | ||||
"a = FloatText()\n", | ||||
"b = FloatSlider()\n", | ||||
"c = FloatProgress()\n", | ||||
"display(a,b,c)\n", | ||||
"\n", | ||||
"\n", | ||||
"mylink = link((a, 'value'), (b, 'value'), (c, 'value'))" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"### Unlinking widgets" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": { | ||||
"slideshow": { | ||||
"slide_type": "slide" | ||||
} | ||||
}, | ||||
"source": [ | ||||
"Unlinking the widgets is simple. All you have to do is call `.unlink` on the link object." | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "code", | ||||
"execution_count": null, | ||||
"metadata": { | ||||
"collapsed": false | ||||
}, | ||||
"outputs": [], | ||||
"source": [ | ||||
"mylink.unlink()" | ||||
] | ||||
}, | ||||
{ | ||||
"cell_type": "markdown", | ||||
"metadata": {}, | ||||
"source": [ | ||||
"[Index](Index.ipynb) - [Next](Widget List.ipynb)" | ||||
] | ||||
} | ||||
], | ||||
Jonathan Frederic
|
r14323 | "metadata": { | ||
Jonathan Frederic
|
r17726 | "kernelspec": { | ||
Min RK
|
r20278 | "display_name": "Python 3", | ||
Jonathan Frederic
|
r17726 | "language": "python", | ||
Min RK
|
r20278 | "name": "python3" | ||
Jonathan Frederic
|
r17726 | }, | ||
Min RK
|
r20278 | "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.2" | ||||
} | ||||
Jonathan Frederic
|
r14323 | }, | ||
Min RK
|
r18669 | "nbformat": 4, | ||
"nbformat_minor": 0 | ||||
Min RK
|
r20278 | } | ||