2015-02-15 2 views
11

Ich habe eine Dropdown-Liste in einem IPython-Notebook (als Teil der HTML-Widgets) und in einer Spyre-App (als dropdown Element) sagen, einen Kontinent zu wählen, und ich möchte um ein zweites Dropdown-Menü hinzuzufügen, um das Land auf dem Kontinent auszuwählen. Nun sind natürlich die Optionen innerhalb des zweiten Dropdowns abhängig von dem Wert des ersten. Ich habe Mühe, eine bequeme Möglichkeit zu finden, eine Callback-Funktion zu haben, die dieses UI-Element aktualisiert.Dynamisch ändern Dropdown-Menüs in IPython Notebook-Widgets und Spyre

Ich habe fast das im IPython-Notebook getan, wo ich eine interact Funktion hatte und innerhalb der aufgerufenen Funktion, würde ich ein zweites interact Element mit dem zweiten Dropdown erstellen. Aber jedes Mal, wenn ich das erste Dropdown-Element ändere, würde ein neues Dropdown-Element erstellt werden, so dass ich bei jeder Änderung ein zusätzliches Dropdown-Menü anzeigen würde. Aber ich möchte nur, dass ein Dropdown aktualisiert wird, das ist alles.

Hoffe, das Problem ist klar. Vielen Dank.

Antwort

13

Verwenden interactive statt interact und Ihr Widget aktualisieren:

from IPython.html import widgets 
from IPython.display import display 

geo={'USA':['CHI','NYC'],'Russia':['MOW','LED']} 

def print_city(city): 
    print city 

def select_city(country): 
    cityW.options = geo[country] 


scW = widgets.Select(options=geo.keys()) 
init = scW.value 
cityW = widgets.Select(options=geo[init]) 
j = widgets.interactive(print_city, city=cityW) 
i = widgets.interactive(select_city, country=scW) 
display(i) 
display(j) 
+2

Hinweis: 'IPython.html.widgets' hat' ipywidgets' bewegt. 'ipywidgets als Widgets importieren' – ksindi

0
import datetime 
import ipywidgets as ipyw 

from bokeh.models.widgets.inputs import AutocompleteInput 
from IPython.display import display 

dp1 = ipyw.Dropdown(options = ['Asia','Europe','Africa']) 
dp2 = ipyw.Dropdown(options = ['India','China','Pakistan','Tibet']) 
asia_list = ['India','China','Pakistan','Tibet'] 
europe_list = ['Germany','France','Italy'] 
africa_list = ['south africa','Nigeria','Kenya'] 
global_vbox = ipyw.VBox() 
global_vbox.children = [dp1,dp2] 
display(global_vbox) 
def continent_change_event(x): 
    global dp1 
    global dp2 
    list_name = dp1.value 
    dp2.index = None #This line is very important for setting the values for widgets other than widget with observe method 
    dp2.index = 0 
    if(list_name == 'Asia'): 
     dp2.options = asia_list 
    elif(list_name == 'Europe'): 
     dp2.options = europe_list 
    else: 
     dp2.options = africa_list 

dp1.observe(continent_change_event)