Widget Events

Special Events

[1]:
from __future__ import print_function

Button kann nicht zur Darstellung eines Datentyps verwendet werden, sondern nur für on_click. Mit der print-Funktion kann der Docstring von on_click ausgegeben werden.

[2]:
import ipywidgets as widgets
print(widgets.Button.on_click.__doc__)
Register a callback to execute when the button is clicked.

        The callback will be called with one argument, the clicked button
        widget instance.

        Parameters
        ----------
        remove: bool (optional)
            Set to true to remove the callback from the list of callbacks.

Beispiele

Button-Klicks sind stateless, d.h. sie übertragen Nachrichten vom Frontend zum Backend. Wenn ihr die on_click-Methode verwendet, wird ein Button angezeigt, der die Nachricht ausgibt, sobald auf sie geklickt wurde.

[3]:
from IPython.display import display
button = widgets.Button(description="Click Me!")
display(button)

def on_button_clicked(b):
    print("Button clicked.")

button.on_click(on_button_clicked)

Traitlet events

Widget-Properties sind IPython-Traitlets. Um Änderungen vorzunehmen, kann die Methode observe des Widgets zum Registrieren eines callback verwendet werden. Den Docstring für observe seht ihr unten.

Weitere Informationen erhaltet ihr unter Traitlet events.

[4]:
print(widgets.Widget.observe.__doc__)
Setup a handler to be called when a trait changes.

        This is used to setup dynamic notifications of trait changes.

        Parameters
        ----------
        handler : callable
            A callable that is called when a trait changes. Its
            signature should be ``handler(change)``, where ``change`` is a
            dictionary. The change dictionary at least holds a 'type' key.
            * ``type``: the type of notification.
            Other keys may be passed depending on the value of 'type'. In the
            case where type is 'change', we also have the following keys:
            * ``owner`` : the HasTraits instance
            * ``old`` : the old value of the modified trait attribute
            * ``new`` : the new value of the modified trait attribute
            * ``name`` : the name of the modified trait attribute.
        names : list, str, All
            If names is All, the handler will apply to all traits.  If a list
            of str, handler will apply to all names in the list.  If a
            str, the handler will apply just to that name.
        type : str, All (default: 'change')
            The type of notification to filter by. If equal to All, then all
            notifications are passed to the observe handler.

Linking Widgets

Für die Verknüpfung von Widget-Attributen könnt ihr diese einfach miteinander verknüpfen.

Linking Traitlet-Attribute im Kernel

[5]:
caption = widgets.Label(value='The values of slider1 and slider2 are synchronized')
sliders1, slider2 = widgets.IntSlider(description='Slider 1'),\
                    widgets.IntSlider(description='Slider 2')
l = widgets.link((sliders1, 'value'), (slider2, 'value'))
display(caption, sliders1, slider2)

Linking Widgets-Attribute auf der Client-Seite

Beim Synchronisieren von Traitlet-Attributen tritt möglicherweise eine Verzögerung aufgrund der Kommunikation mit dem Server auf. Ihr könnt jedoch die Widget-Attribute auch direkt im Browser mit den Link-Widgets verknüpfen. Dabei bleiben die Javascript-Links mit jslink auch bestehen, wenn Widgets in HTML-Webseiten ohne Kernel eingebettet werden.

[6]:
caption = widgets.Label(value='The values of range1 and range2 are synchronized')
range1, range2 = widgets.IntSlider(description='Range 1'),\
                 widgets.IntSlider(description='Range 2')
l = widgets.jslink((range1, 'value'), (range2, 'value'))
display(caption, range1, range2)
[7]:
caption = widgets.Label(value='Changes in source_range values are reflected in target_range1')
source_range, target_range1 = widgets.IntSlider(description='Source range'),\
                              widgets.IntSlider(description='Target range 1')
dl = widgets.jsdlink((source_range, 'value'), (target_range1, 'value'))
display(caption, source_range, target_range1)

Kontinuierliche Updates

Einige Widgets bieten ein continuous_update-Attribut mit der Möglichkeit, Werte kontinuierlich zu aktualisieren. Im folgenden Beispiel sehen wir, dass die delayed Controls ihren Wert erst übertragen, nachdem der Benutzer den Schieberegler gezogen oder das Textfeld gesendet hat. Die continuous slides übertragen ihre Werte kontinuierlich, sobald sie geändert werden.

[8]:
a = widgets.IntSlider(description="Delayed", continuous_update=False)
b = widgets.IntText(description="Delayed", continuous_update=False)
c = widgets.IntSlider(description="Continuous", continuous_update=True)
d = widgets.IntText(description="Continuous", continuous_update=True)

widgets.link((a, 'value'), (b, 'value'))
widgets.link((a, 'value'), (c, 'value'))
widgets.link((a, 'value'), (d, 'value'))
widgets.VBox([a,b,c,d])