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