Jupyter notebook 使用jupyter小部件动态生成与搜索相结合的复选框

Jupyter notebook 使用jupyter小部件动态生成与搜索相结合的复选框,jupyter-notebook,ipywidgets,Jupyter Notebook,Ipywidgets,我建立了一个jupyter笔记本来分析和对比历史数据。由于数据库相当大,我使用了一个搜索+观察小部件,允许用户选择他们想要的实验,而不是滚动浏览所有数据。现在,所有实验的所有复选框都已生成,但这两个复选框太大,无法放入框中,并且占用了大量时间 有没有办法在默认情况下只显示最后10个实验,并且在搜索后只生成所需的复选框 我把代码建立在这个基础上。我已经尝试在else循环中移动checkbox小部件,但是没有成功。此外,在我的代码中,全局/局部变量的情况似乎很混乱 import ipywidgets

我建立了一个jupyter笔记本来分析和对比历史数据。由于数据库相当大,我使用了一个搜索+观察小部件,允许用户选择他们想要的实验,而不是滚动浏览所有数据。现在,所有实验的所有复选框都已生成,但这两个复选框太大,无法放入框中,并且占用了大量时间

有没有办法在默认情况下只显示最后10个实验,并且在搜索后只生成所需的复选框

我把代码建立在这个基础上。我已经尝试在else循环中移动checkbox小部件,但是没有成功。此外,在我的代码中,全局/局部变量的情况似乎很混乱

import ipywidgets as widgets

#Generate a dummy list
Allfileslist = ["Experiment {}".format(x) for x in range(600)]
#Search box + generate ALL the checkboxes, this seems to be the bottleneck
search_widget = widgets.Text(placeholder='Type for older experiments',                 description= 'Search:')
experiments = {eachfilename: widgets.Checkbox(description=eachfilename, value=False) for eachfilename in Allfileslist}
options = [experiments[eachfilename] for eachfilename in Allfileslist]
options_widget = widgets.VBox(options, layout={'overflow': 'auto'})


def whentextischanged (change):
    """Dynamically update the widget experiments"""
    search_input = change['new']
    if search_input == '':
        # Reset search field, default to last 9 experiments
        new_options = [experiments[eachfilename] for eachfilename in Allfileslist[-10:]]
    else:
        # Filter by search
        close_matches = [x for x in Allfileslist if search_input.upper() in x]
        ### magic code that generates only the match boxes ###
        new_options = [experiments[eachfilename] for eachfilename in close_matches]

    options_widget.children = new_options

#Generate the vbox, search
multi_select = widgets.VBox([search_widget, options_widget])
search_widget.observe(whentextischanged, names='value')
#serve it up
multi_select
有没有办法只生成加快速度所需的复选框

更新 我对ac24的答案进行了一些修改,它几乎做到了它所需要的。唯一没有显示的是当搜索框开始时为空时显示默认值。然后,清除搜索框显示正确的行为

将IPyWidget作为小部件导入
#生成虚拟列表
AllFileList=[“{}”。范围(600)内x的格式(x)]
#搜索框+生成一些复选框
search_widget=widgets.Text(占位符='Type for older experiments',description='search:',value='')
实验={}
options_widget=widgets.VBox(布局={'overflow':'auto'})
所有文件列表中每个文件名的默认\u选项=[widgets.Checkbox(description=eachfilename,value=False)[10:]
def何时被更改(更改):
“”“动态更新小部件实验”“”
搜索\输入=更改['new']
如果搜索输入=“”:
#重置搜索字段,默认为最后9个实验
新选项=默认选项
其他:
#按搜索筛选
close_matches=[x代表所有文件列表中的x,如果在x.lower()中搜索_input.lower()][:10]
对于close_匹配中的名称:
如果名称不在实验中:
实验[name]=widgets.Checkbox(description=name,value=False)
new_options=[在关闭_匹配中每个文件名的实验[eachfilename]
options\u widget.children=新的\u选项
#生成vbox,搜索
multi\u select=widgets.VBox([search\u widget,options\u widget])
search_widget.observe(当extexchange时,names='value')
多选

试着先创建一个空字典,然后在离理想的实验选择越来越近的时候填充复选框

将IPyWidget作为小部件导入
#生成虚拟列表
AllFileList=[“{}”。范围(600)内x的格式(x)]
#搜索框+生成所有复选框,这似乎是瓶颈
search_widget=widgets.Text(占位符='Type for older experiments',description='search:')
#experiments={eachfilename:widgets.Checkbox(description=eachfilename,value=False),用于Allfileslist}中的eachfilename
实验={}
options_widget=widgets.VBox(布局={'overflow':'auto'})
def何时被更改(更改):
“”“动态更新小部件实验”“”
搜索\输入=更改['new']
如果搜索输入=“”:
#重置搜索字段,默认为最后9个实验
new_options=[所有文件列表中每个文件名的实验[eachfilename][-10:]
其他:
#按搜索筛选
close_matches=[x代表所有文件列表中的x,如果在x.lower()中搜索_input.lower()][:10]
对于close_匹配中的名称:
如果名称不在实验中:
实验[name]=widgets.Checkbox(description=name,value=False)
###仅生成匹配框的魔法代码###
new_options=[在关闭_匹配中每个文件名的实验[eachfilename]
options\u widget.children=新的\u选项
#生成vbox,搜索
multi\u select=widgets.VBox([search\u widget,options\u widget])
search_widget.observe(当extexchange时,names='value')
#上菜
多选

然后,一旦您选择了一些选项,请调用
[键对键,exp\u签入exp\u checkbox.items()(如果exp\u check.value)]
查看所选的值。

谢谢您的回答!我稍微修改了你的答案,几乎奏效了。只是默认的选择没有显示,有什么想法吗?有什么想法吗?有什么想法吗?没有把
whentextdischange({'new':''})
作为
display(multi_select)
之前的第二行到最后一行放在
whentextdischange({'new':'})
?非常有意思,但不幸的是完全符合我通常的编码标准。非常感谢你!