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