Function 使用observe函数调用在选择框中显示子类别列表的函数仅在第一次起作用

Function 使用observe函数调用在选择框中显示子类别列表的函数仅在第一次起作用,function,ipywidgets,globals,Function,Ipywidgets,Globals,我有一个简单的df有主要类别和它的子项。我制作了两个选择框来选择主要类别,它会使用“观察”自动在另一个选择框中显示所属的项目 但它只在第一次选择类别时起作用,在我选择另一个类别后,它不会在另一个选择框中显示子项 如果我在“def”中添加“observe”,则该函数将按我所希望的方式工作。 但是,如果我有许多其他的“def”在观察更改时执行,那么这种方法很麻烦。 我也在寻找一种方法,使这段代码不使用全局变量而变得简单。 同时也欢迎任何使代码更简单、更轻巧的想法 首先,感谢您提供了完整而清晰的示例

我有一个简单的df有主要类别和它的子项。我制作了两个选择框来选择主要类别,它会使用“观察”自动在另一个选择框中显示所属的项目 但它只在第一次选择类别时起作用,在我选择另一个类别后,它不会在另一个选择框中显示子项

如果我在“def”中添加“observe”,则该函数将按我所希望的方式工作。 但是,如果我有许多其他的“def”在观察更改时执行,那么这种方法很麻烦。 我也在寻找一种方法,使这段代码不使用全局变量而变得简单。 同时也欢迎任何使代码更简单、更轻巧的想法


首先,感谢您提供了完整而清晰的示例

解决方案是不要在您正在观察的函数中创建新的小部件。只需更新
名称框
小部件的
选项
。这样,就不需要全局变量

将熊猫作为pd导入
将ipywidgets作为工作组导入
从ipywidgets导入*
从IPython.display导入显示中,清除\u输出
df_list=[{'Category':'fruit','name':['banana','apple','mango']}\
{'Category':'animal','name':['lion','monkey','tiger','cat','dog']}\
{'Category':'body','name':['eyes','hands','ears','arms']}\
{'Category':'office','name':['table','computer','printer']}]
df=pd.DataFrame(df_列表)
Category_box=wg.Select(选项=list(df.Category),连续更新=False,布局=layout(width='30%'))
name_box=wg.Select(options=list(df[df['Category']==Category_box.value].name)[0],continuous_update=False\
布局=布局(宽度为30%)
hbox=wg.hbox(子类=[类别框,名称框])
显示器(hbox)
def在更改时选择更改(更改):
如果更改['name']=='value':
name_box.options=list(df[df['Category']==Category_box.value].name)[0]
类别框。观察(在更改时选择)

不客气,如果答案解决了问题,请接受?
import pandas as pd
import ipywidgets as wg
from ipywidgets import *
from IPython.display import display, clear_output
df_list=[{'Category':'fruit','name':['banana','apple','mango']},\
         {'Category':'animal','name':['lion','monkey','tiger','cat','dog']},\
         {'Category':'body','name':['eyes','hands','ears','arms']},\
         {'Category':'office','name':['table','computer','printer']}]
df=pd.DataFrame(df_list)

Category_box=wg.Select(options=list(df.Category),continuous_update=False,layout=Layout(width='30%'))
name_box=wg.Select(options=list(df[df['Category']==Category_box.value].name)[0],continuous_update=False,\
                   layout=Layout(width='30%'))
hbox=wg.HBox(children=[Category_box,name_box])
display(hbox)

def select_on_change(change):
    if change['name'] == 'value':
        global Category_box
        global name_box
        global hbox
        Category_box=wg.Select(options=list(df.Category),continuous_update=False,layout=Layout(width='30%'),value=Category_box.value)
        name_box=wg.Select(options=list(df[df['Category']==Category_box.value].name)[0],continuous_update=False,\
                   layout=Layout(width='30%'))
        hbox=wg.HBox(children=[Category_box,name_box])
        clear_output()
        display(hbox)
    #Category_box.observe(select_on_change)


Category_box.observe(select_on_change)