You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
7.2 KiB
248 lines
7.2 KiB
{
|
|
"metadata": {
|
|
"cell_tags": [
|
|
[
|
|
"<None>",
|
|
null
|
|
]
|
|
],
|
|
"name": "",
|
|
"signature": "sha256:8cade57fabc6819dc950bc28502028554861fb1440d5d832922b95fd2b8bf25c"
|
|
},
|
|
"nbformat": 3,
|
|
"nbformat_minor": 0,
|
|
"worksheets": [
|
|
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"collapsed": false,
|
|
"input": [
|
|
"from __future__ import print_function # 2.7 compatability\n",
|
|
"\n",
|
|
"from IPython.html import widgets # Widget definitions\n",
|
|
"from IPython.display import display # Used to display widgets in the notebook"
|
|
],
|
|
"language": "python",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"prompt_number": 1
|
|
},
|
|
{
|
|
"cell_type": "heading",
|
|
"level": 1,
|
|
"metadata": {},
|
|
"source": [
|
|
"Traitlet Events"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"As mentioned in Part 1, the widget attributes are IPython traitlets. Traitlets are eventful. To handle changes, the `on_trait_change` method of the widget can be used to register a callback. The docstring for `on_trait_change` can be seen below. Both the `name` and `remove` properties are optional."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"collapsed": false,
|
|
"input": [
|
|
"print(widgets.Widget.on_trait_change.__doc__)"
|
|
],
|
|
"language": "python",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"stream": "stdout",
|
|
"text": [
|
|
"Setup a handler to be called when a trait changes.\n",
|
|
"\n",
|
|
" This is used to setup dynamic notifications of trait changes.\n",
|
|
"\n",
|
|
" Static handlers can be created by creating methods on a HasTraits\n",
|
|
" subclass with the naming convention '_[traitname]_changed'. Thus,\n",
|
|
" to create static handler for the trait 'a', create the method\n",
|
|
" _a_changed(self, name, old, new) (fewer arguments can be used, see\n",
|
|
" below).\n",
|
|
"\n",
|
|
" Parameters\n",
|
|
" ----------\n",
|
|
" handler : callable\n",
|
|
" A callable that is called when a trait changes. Its\n",
|
|
" signature can be handler(), handler(name), handler(name, new)\n",
|
|
" or handler(name, old, new).\n",
|
|
" name : list, str, None\n",
|
|
" If None, the handler will apply to all traits. If a list\n",
|
|
" of str, handler will apply to all names in the list. If a\n",
|
|
" str, the handler will apply just to that name.\n",
|
|
" remove : bool\n",
|
|
" If False (the default), then install the handler. If True\n",
|
|
" then unintall it.\n",
|
|
" \n"
|
|
]
|
|
}
|
|
],
|
|
"prompt_number": 2
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Mentioned in the doc string, the callback registered can have 4 possible signatures:\n",
|
|
"\n",
|
|
"- callback()\n",
|
|
"- callback(trait_name)\n",
|
|
"- callback(trait_name, new_value)\n",
|
|
"- callback(trait_name, old_value, new_value)\n",
|
|
"\n",
|
|
"Using this method, an example of how to output an IntSliderWiget's value as it is changed can be seen below."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"collapsed": false,
|
|
"input": [
|
|
"int_range = widgets.IntSliderWidget()\n",
|
|
"display(int_range)\n",
|
|
"\n",
|
|
"def on_value_change(name, value):\n",
|
|
" print(value)\n",
|
|
"\n",
|
|
"int_range.on_trait_change(on_value_change, 'value')"
|
|
],
|
|
"language": "python",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"prompt_number": 3
|
|
},
|
|
{
|
|
"cell_type": "heading",
|
|
"level": 1,
|
|
"metadata": {},
|
|
"source": [
|
|
"Specialized Events"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "heading",
|
|
"level": 2,
|
|
"metadata": {},
|
|
"source": [
|
|
"Button Click Event"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"The `ButtonWidget` is a special widget, like the `ContainerWidget` and `TabWidget`, that isn't used to represent a data type. Instead the button widget is used to handle mouse clicks. The `on_click` method of the `ButtonWidget` can be used to register function to be called when the button is clicked. The docstring of the `on_click` can be seen below."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"collapsed": false,
|
|
"input": [
|
|
"print(widgets.ButtonWidget.on_click.__doc__)"
|
|
],
|
|
"language": "python",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"stream": "stdout",
|
|
"text": [
|
|
"Register a callback to execute when the button is clicked.\n",
|
|
"\n",
|
|
" The callback will be called with one argument,\n",
|
|
" the clicked button widget instance.\n",
|
|
"\n",
|
|
" Parameters\n",
|
|
" ----------\n",
|
|
" remove : bool (optional)\n",
|
|
" Set to true to remove the callback from the list of callbacks.\n"
|
|
]
|
|
}
|
|
],
|
|
"prompt_number": 4
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Button clicks are transmitted from the front-end to the back-end using custom messages. By using the `on_click` method, a button that prints a message when it has been clicked is shown below."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"collapsed": false,
|
|
"input": [
|
|
"button = widgets.ButtonWidget(description=\"Click Me!\")\n",
|
|
"display(button)\n",
|
|
"\n",
|
|
"def on_button_clicked(b):\n",
|
|
" print(\"Button clicked.\")\n",
|
|
"\n",
|
|
"button.on_click(on_button_clicked)"
|
|
],
|
|
"language": "python",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"stream": "stdout",
|
|
"text": [
|
|
"Button clicked.\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"stream": "stdout",
|
|
"text": [
|
|
"Button clicked.\n"
|
|
]
|
|
},
|
|
{
|
|
"output_type": "stream",
|
|
"stream": "stdout",
|
|
"text": [
|
|
"Button clicked.\n"
|
|
]
|
|
}
|
|
],
|
|
"prompt_number": 5
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Event handlers can also be used to create widgets. In the example below, clicking a button spawns another button with a description equal to how many times the parent button had been clicked at the time."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"collapsed": false,
|
|
"input": [
|
|
"def new_button(clicked):\n",
|
|
" button = widgets.ButtonWidget()\n",
|
|
" button.clicks = 0\n",
|
|
" clicked.clicks += 1\n",
|
|
" button.description = \"%d\" % clicked.clicks\n",
|
|
" display(button)\n",
|
|
" button.on_click(new_button)\n",
|
|
"button = widgets.ButtonWidget(description = \"Start\")\n",
|
|
"button.clicks = 0\n",
|
|
"display(button)\n",
|
|
"button.on_click(new_button)\n",
|
|
" "
|
|
],
|
|
"language": "python",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"prompt_number": 6
|
|
}
|
|
],
|
|
"metadata": {}
|
|
}
|
|
]
|
|
} |