2015-12-01 3 views
6

kann ich einen Handler button.on_click in ipython Notebook-Widgets registrieren, aber ich weiß nicht, wie man das gleiche für einen Drop-Down-Widget scheintipywidgets Dropdown-Widgets: Was ist das Onchange-Ereignis?

import ipywidgets as widgets 
from IPython.display import display 

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

button = widgets.Button(description="Click Me!") 
display(button) 

button.on_click(on_button_clicked) 

Aber für

choose_task = widgets.Dropdown(
    options=['Addition', 'Multiplication', 'Subtraction'], 
    value='Addition', 
    description='Task:', 
) 

zu tun, es zu nur

Wenn ich einen Handler mit diesem registriere, kann ich ihn verwenden, um auf den Wert des Widgets zuzugreifen? Ich habe Beispiele mit dem Handler gesehen, und das Widget gehört zu einer Unterklasse, und der Handler kann self verwenden, um zu inspizieren. Aber wenn ich keine Unterklasse verwenden möchte, wie weiß der Handler, welches Widget das Ziel des Ereignisses war?

+0

haben Sie jemals Ihre Selbstbeobachtung Frage herauszufinden? –

Antwort

12

Zwischen this link und the traitlet docs on github und nur herumgespielt, ich das endlich herausgefunden:

w = widgets.Dropdown(
    options=['Addition', 'Multiplication', 'Subtraction'], 
    value='Addition', 
    description='Task:', 
) 

def on_change(change): 
    if change['type'] == 'change' and change['name'] == 'value': 
     print "changed to %s" % change['new'] 

w.observe(on_change) 

display(w) 

Insgesamt ist dies viel reicher als die veraltete Schnittstelle aussieht, aber es könnte definitiv mehr Beispiele verwenden.

0

Ich glaube, die Idee ist, Merkmal Name, z. Wert. Zum Beispiel:

from ipywidgets import Dropdown 

def handle_change(): 
    print type_sel.value 

type_sel = Dropdown(description="Keypoint type", options=['surf', 'orb']) 
type_sel.on_trait_change(handle_change, name="value") 
display(type_sel) 

SciPy 2015 Advanced Jupyter Video Tutorial

+6

Das ist schrecklich dokumentiert –

+1

Ich bekomme auch eine Warnung, wenn ich versuche, dies zu verwenden: '' '[...]/anaconda/lib/python2.7/Site-Pakete/ipykernel/__ main__.py:13: DeprecationWarning: on_trait_change ist in Traitlets veraltet 4.1: benutze stattdessen beobachte''', aber wenn ich versuche, 'observe' zu ​​verwenden, wird mein Handler dreimal aufgerufen. – sfjac

1

es alle zusammen

Inspired auf früheren Antworten und Lambda-Ausdrücke, die ich verwenden:

def function(option): 
    print(option) 


w = widgets.Dropdown(
    options=['None', 'Option 1', 'Option 2', 'Option 3'], 
    description='Option:', 
    disabled=False 
) 

w.observe(
    lambda c: plot_content(c['new']) if (c['type'] == 'change' and c['name'] == 'value') else None 
) 

display(w)