{ "metadata": { "cell_tags": [ [ "", 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": {} } ] }