首页 > 解决方案 > 如何让 panel.widgets.MultiSelect 的选项依赖于其他小部件输入

问题描述

我有一个多选小部件,pn.widgets.MultiSelect,我试图得到它,当它的值被选中时,它会更新options另一个pn.widgets.MultiSelect. 这与更改另一个选择小部件时如何自动更新下拉选择小部件非常相似?(Python panel pyviz)但是,我在实现它方面并没有取得太大的成功。

使用上面示例中的数据,但作为pandas数据框,当我尝试更新选项时,没有任何反应:

outerType = pn.widgets.MultiSelect(name="Outer", 
                                   value=["Africa"], 
                                   options=np.unique(df.cont).tolist())     

innerType = pn.widgets.MultiSelect(name="Inner",
 options=np.unique(df.loc[df['cont'].isin(outerType.value)].country).tolist())     

@pn.depends(outerType, watch=True)
def _update(outerType):
    _values = np.unique(df.loc[df['cont'].isin(outerType.value)].country).tolist()
    innerType.options = _values
    innerType.value = _values
    
pn.Row(outerType, innerType)

在此处输入图像描述

如果我使用也会发生同样的情况

@pn.depends(outerType.param.value, watch=True)
def _update(outerType):

但是,如果我使用下面的代码,它会按我的预期执行;这AnyOldDummy用作 中的参数def。请问我怎样才能正确地做到这一点?

outerType = pn.widgets.MultiSelect(name="Outer",
                                   value=["Africa"], 
                                   options=np.unique(df.cont).tolist())     

innerType = pn.widgets.MultiSelect(name="Inner", 
  options=np.unique(df.loc[df['cont'].isin(outerType.value)].country).tolist() )     

@pn.depends(outerType, watch=True)
def _update(AnyOldDummy):
    _values = np.unique(df.loc[df['cont'].isin(outerType.value)].country).tolist()
    innerType.options = _values
    innerType.value = _values
    
pn.Row(outerType, innerType)

在此处输入图像描述

数据:

import numpy as np
import pandas as pd
import panel as pn
pn.extension()

_countries = {
    'Africa': ['Ghana', 'Togo', 'South Africa'],
    'Asia'  : ['China', 'Thailand', 'Japan'],
    'Europe': ['Austria', 'Bulgaria', 'Greece']
}
df = []
for cont in _countries.keys(): 
    co = _countries.get(cont)
    df.append(np.c_[np.repeat(cont, len(co)), co])   
df = pd.DataFrame(np.vstack(df), columns=['cont', 'country'])  

标签: widgetholovizpanel-pyviz

解决方案


推荐阅读