当另一个选择小部件更改时,如何自动更新下拉选择小部件?(Python 面板 pyviz)

San*_*ord 9 python holoviews pyviz holoviz panel-pyviz

我有一个 Select 小部件,当另一个 Select 小部件更改时,它应该提供不同的选项列表,因此只要其他 Select 小部件发生更改,它就会更新。我如何在下面的示例代码中执行此操作?

根据另一个下拉菜单的变化选择下拉菜单

 _countries = {
    'Africa': ['Ghana', 'Togo', 'South Africa'],
    'Asia'  : ['China', 'Thailand', 'Japan'],
    'Europe': ['Austria', 'Bulgaria', 'Greece']
}

continent = pn.widgets.Select(
    value='Asia', 
    options=['Africa', 'Asia', 'Europe']
)

country = pn.widgets.Select(
    value=_countries[continent.value][0], 
    options=_countries[continent.value]
)

@pn.depends(continent.param.value)
def _update_countries(continent):
    countries = _countries[continent]
    country.options = countries
    country.value = countries[0]

pn.Row(continent, country)
Run Code Online (Sandbox Code Playgroud)

San*_*ord 15

因此,我花了很长时间才发现这一点,但是在您的 @pn.depends() 中,您必须添加参数 watch=True,因此它会不断侦听是否正在发生更改,并且应该完成对其他列表的更新。
在这种情况下:

@pn.depends(continent.param.value, watch=True)
Run Code Online (Sandbox Code Playgroud)

整个例子:

_countries = {
    'Africa': ['Ghana', 'Togo', 'South Africa'],
    'Asia'  : ['China', 'Thailand', 'Japan'],
    'Europe': ['Austria', 'Bulgaria', 'Greece']
}

continent = pn.widgets.Select(
    value='Asia', 
    options=['Africa', 'Asia', 'Europe']
)

country = pn.widgets.Select(
    value=_countries[continent.value][0], 
    options=_countries[continent.value]
)

@pn.depends(continent.param.value, watch=True)
def _update_countries(continent):
    countries = _countries[continent]
    country.options = countries
    country.value = countries[0]

pn.Row(continent, country)
Run Code Online (Sandbox Code Playgroud)

此页面上的 GoogleMapViewer 示例为我指明了正确的方向:
更改另一个选择器后的选择器更新

相同的答案,但以类的形式:

class GoogleMapViewer(param.Parameterized):

    continent = param.Selector(default='Asia', objects=['Africa', 'Asia', 'Europe'])

    country = param.Selector(default='China', objects=['China', 'Thailand', 'Japan'])

    _countries = {'Africa': ['Ghana', 'Togo', 'South Africa'],
                  'Asia'  : ['China', 'Thailand', 'Japan'],
                  'Europe': ['Austria', 'Bulgaria', 'Greece']}

    @param.depends('continent', watch=True)
    def _update_countries(self):
        countries = self._countries[self.continent]
        self.param['country'].objects = countries
        self.country = countries[0]

viewer = GoogleMapViewer(name='Google Map Viewer')
pn.Row(viewer.param)
Run Code Online (Sandbox Code Playgroud)

  • 正确的; 如果您希望Panel在监视的参数发生变化时自动执行该函数,则需要“watch=True”。否则,依赖关系信息将被声明但不会执行,这在 Panel 与读取这些依赖关系的各种框架一起使用时很重要,但在这里您希望 Panel 负责一切,从而明确请求监视。 (2认同)