ipywidgets:根据另一个部件的结果更新一个部件
我在IPython中使用小部件,该部件允许用户重复搜索短语并在另一个小部件(选择小部件)中查看结果(不同的标题),然后选择其中一个结果。
简而言之:
search_text = widgets.Text(description = 'Search')
search_result = widgets.Select(description = 'Select table')
def search_action(sender):
phrase = search_text.value
df = search(phrase) # A function that returns the results in a pandas df
titles = df['title'].tolist()
search_result.options = titles
search_text.on_submit(search_action)
这曾经可以正常工作,但是在更新到最新版本的ipywidgets(4.0.1的5.1.3)之后,
search_selection.options = titles
产生以下错误(一个或两个,不同):
TraitError: Invalid selection
TypeError: 'list' object is not callable
它仍然可以在某种意义上起作用,即该小部件会根据其他小部件的搜索结果来更新结果,但是会出现错误。
根据另一个窗口小部件的结果在一个窗口小部件中设置选项的正确方法是什么?
(编辑:添加了更详细的错误消息)
-
您可以在分配给的过程中保留有关的通知
options
:with search_result.hold_trait_notifications(): search_result.options = titles
从而:
search_text = widgets.Text(description = 'Search') search_result = widgets.Select(description = 'Select table') def search_action(sender): phrase = search_text.value df = search(phrase) # A function that returns the results in a pandas df titles = df['title'].tolist() with search_result.hold_trait_notifications(): search_result.options = titles
请参阅下面的hmelberg解释
“错误的根源是该窗口小部件还具有value属性,并且该值可能不在新的选项列表中。因此,窗口小部件的值可能会在短时间内被“孤立”,从而产生错误。”