2015-12-01 9 views
6

Posso registrare un gestore per button.on_click in ipython widget notebook, ma non so come fare la stessa cosa per un widget a discesaipywidgets dropdown widgets: qual è l'evento onchange?

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) 

Ma per

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

sembra che ci solo

on_trait_change(...) 

se registro un gestore con questo, posso usarlo per accedere al valore del widget? Ho visto esempi con il gestore e il widget appartiene a una sottoclasse e il gestore può utilizzare il sé per introspettarsi. Ma se non voglio usare una sottoclasse, come fa il gestore a sapere quale widget è stato il bersaglio dell'evento?

+0

Hai mai capire il vostro domanda introspezione? –

risposta

12

Tra this link e the traitlet docs on github e solo giocando in giro, ho finalmente capito questo:

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) 

Nel complesso questo sembra molto più ricco l'interfaccia deprecato, ma è potrebbe sicuramente usare più esempi.

0

Credo che l'idea sia quella di utilizzare il tratto nome, ad es. valore. Per esempio:

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

Ciò è orribilmente documentato –

+1

Inoltre, viene visualizzato un avviso quando provo a utilizzare questo: '' [...]/anaconda/lib/python2.7/site-packages/ipykernel/__ main__.py:13: DeprecationWarning: on_trait_change è deprecato in traitlet 4.1: use observ invece''', ma quando provo a usare 'observ' il mio gestore viene chiamato tre volte. – sfjac

1

Mettere tutto insieme

ispirato risposte precedenti e le espressioni lambda Io uso questo:

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)