Jupyter 笔记本上的多个依赖小部件(下拉菜单)



我从这里开始了如何处理jupyter笔记本上的多个依赖小部件的示例:

动态更改 IPython 笔记本小部件和 Spyre 中的下拉列表

在该示例中,代码解决方案如下:

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.Dropdown(options=geo.keys())
init = scW.value
cityW = widgets.Dropdown(options=geo[init])
j = widgets.interactive(print_city, city=cityW)
i = widgets.interactive(select_city, country=scW)
display(i)
display(j)

因此,第二个下拉列表取决于第一个下拉列表的值。这里有一个问题:如果我想创建依赖于第二个下拉列表的值的第三个下拉列表怎么办?假设上面的每个城市(CHI,NYC,MOW,LED(都有一些地区,我希望每次更新城市时都会更改第三个下拉列表。

希望问题清楚,谢谢!

以防万一你从来没有找到解决方案:我这里有一个适用于python 3的解决方案。我已经注释了我从原始代码更改的所有内容。我希望它有所帮助!

from IPython.html import widgets
from IPython.display import display
geo={'USA':['CHI','NYC'],'Russia':['MOW','LED']}
geo2={'CHI':['1','2'],'NYC':['3','4'],'MOW':['5','6'],'LED':['7','8']} #create dictionary with city districts
def print_city(city,district):
    print(city)
    print(district) #add in command to print district
def select_city(country):
    cityW.options = geo[country]
#add in 'select district' function that looks in the new dictionary
def select_district(city):
    districtW.options = geo2[city]
scW = widgets.Dropdown(options=geo.keys())
init = scW.value
cityW = widgets.Dropdown(options=geo[init])

init2= cityW.value #new start value for district dropdown
districtW = widgets.Dropdown(options=geo2[init2]) #define district dropdown widget
j = widgets.interactive(print_city, city=cityW, district=districtW) #define district value
i = widgets.interactive(select_city, country=scW)
k = widgets.interactive(select_district, city=cityW) #call everything together with new interactive
display(i)
display(j)

使用interactive对我来说有些笨拙。我在这里为原始页面中的两个依赖小部件提供了更清晰、更简洁的答案。下面我为多个依赖小部件提供答案。

from ipywidgets import interact, Dropdown
geo = {'USA':['CHI','NYC'],'Russia':['MOW','LED']}
geo2={'CHI':['1','2'],'NYC':['3','4'],'MOW':['5','6'],'LED':['7','8']}
countryW = Dropdown(options = geo.keys())
cityW = Dropdown(options = geo[countryW.value]) # options = geo[countryW.value] is to remove inital error but not that necessary.
districtW = Dropdown()
@interact(country = countryW, city = cityW, district = districtW)
def print_city(country, city, district):
    cityW.options = geo[country] # Here is the trick, i.e. update cityW.options based on country, namely countryW.value.
    districtW.options = geo2[city] # Dittoo
    print(country, city, district)

另一种方法是使用如下所示的显式更新函数。请记住,更新速度可能不会那么快。代码运行良好。

from ipywidgets import interact, Dropdown
geo = {'USA':['CHI','NYC'],'Russia':['MOW','LED']}
geo2={'CHI':['1','2'],'NYC':['3','4'],'MOW':['5','6'],'LED':['7','8']}
countryW = Dropdown(options = geo.keys())
cityW = Dropdown()
districtW = Dropdown()
def update_cityW_options(*args): # *args represent zero (case here) or more arguments.
    cityW.options = geo[countryW.value]
cityW.observe(update_cityW_options) # Here is the trick, i.e. update cityW.options based on countryW.value.
def update_districtW_options(*args):
    districtW.options = geo2[cityW.value]
districtW.observe(update_districtW_options)
@interact(country = countryW, city = cityW, district = districtW)
def print_city(country, city, district):
    print(country, city, district)

最新更新