Динамически изменяющиеся выпадающие списки в виджетах IPython для ноутбуков и Spyre

У меня есть раскрывающийся список в IPython-ноутбуке (как часть виджетов HTML) и в приложении Spyre (как элемент dropdown), скажем, чтобы выбрать континент, и я бы хотел добавить второе раскрывающееся меню, чтобы выбрать страны на континенте. Теперь, очевидно, параметры во втором раскрывающемся списке зависят от значения первого. Я пытаюсь найти удобный способ иметь функцию обратного вызова, которая обновила бы этот элемент пользовательского интерфейса.

Я почти сделал это в ноутбуке IPython, где у меня была одна функция interact и внутри вызываемой функции я создал бы второй элемент interact со вторым выпадающим списком. Но всякий раз, когда я меняю первый раскрывающийся список, будет создан новый элемент выпадающего списка, поэтому в каждом изменении вы получите одно раскрывающееся меню. Но я хочу, чтобы только одно выпадающее меню было обновлено, все.

Надеюсь, что проблема ясна. Спасибо.

Ответ 1

Используйте interactive вместо interact и обновите виджет:

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)