<p>我一小时前就遇到了这个问题。我用这里的最小示例<a href="https://stackoverflow.com/questions/28529157/dynamically-changing-dropdowns-in-ipython-notebook-widgets-and-spyre">Dynamically changing dropdowns in IPython notebook widgets and Spyre</a>拼凑出了一个解决方案,因为我自己的需求是动态链接列表。我相信你能用这个解决方案来适应你的需求。</p>
<p>关键是预生成所有下拉列表/选择。出于某种原因,<code>w.options = l</code>只设置<code>w._options_labels</code>,而不设置<code>w.options</code>。随后对<code>w</code>所选值的验证将严重失败。</p>
<pre><code>import ipywidgets as widgets
from IPython.display import display
geo={'USA':['CHI','NYC'],'Russia':['MOW','LED']}
geoWs = {key: widgets.Select(options=geo[key]) for key in geo}
def get_current_state():
return {'country': i.children[0].value,
'city': i.children[1].value}
def print_city(**func_kwargs):
print('func_kwargs', func_kwargs)
print('i.kwargs', i.kwargs)
print('get_current_state', get_current_state())
def select_country(country):
new_i = widgets.interactive(print_city, country=countryW, city=geoWs[country['new']])
i.children = new_i.children
countryW = widgets.Select(options=list(geo.keys()))
init = countryW.value
cityW = geoWs[init]
countryW.observe(select_country, 'value')
i = widgets.interactive(print_city, country=countryW, city=cityW)
display(i)
</code></pre>
<p>最后请注意,获取小部件的最新状态并非易事。这些是</p>
<ul>
<li>直接从子值,通过<code>get_current_state</code>。这是可以信任的。</li>
<li>从交互实例,通过<code>i.kwargs</code></li>
<li>从提供的参数到<code>print_city</code></li>
</ul>
<p>后两种方法有时会过时,因为种种原因,我不想进一步了解。</p>
<p>希望这有帮助。</p>