使用 jupyter 小部件动态生成复选框并结合搜索
Dynamically generate tickboxes combined with a search in using jupyter widgets
我构建了一个 jupyter notebook 来分析和对比历史数据。因为数据库非常大,所以我使用搜索 + 观察小部件来允许用户 select 他们想要的实验,而不是滚动浏览所有数据。现在,所有实验的所有复选框都已生成,但这既太大而无法放入框中,而且会占用大量时间。
有没有办法在默认情况下仅显示最后 10 个实验,并在搜索后仅生成所需的复选框?
我的代码基于此gist。我已经尝试将复选框小部件移动到 else 循环中,但这没有用。此外,global/local 变量情况在我的代码中似乎很混乱。
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 的答案与一些修改结合起来,它几乎可以完成所需的工作。唯一没有的是当搜索框一开始为空时显示默认值。之后,清除搜索框显示正确的行为。
import ipywidgets as widgets
#Generate a dummy list
Allfileslist = ["{}".format(x) for x in range(600)]
#Search box + generate some checboxes
search_widget = widgets.Text(placeholder='Type for older experiments', description= 'Search:',value='')
experiments = {}
options_widget = widgets.VBox(layout={'overflow': 'auto'})
default_options = [widgets.Checkbox(description=eachfilename, value=False) for eachfilename in Allfileslist[-10:]]
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 = default_options
else:
# Filter by search
close_matches = [x for x in Allfileslist if search_input.lower() in x.lower()][:10]
for name in close_matches:
if name not in experiments:
experiments[name] = widgets.Checkbox(description=name, value=False)
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')
multi_select
首先尝试创建一个空字典,然后在接近您想要的实验选择时填充复选框。
import ipywidgets as widgets
#Generate a dummy list
Allfileslist = ["{}".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}
experiments = {}
options_widget = widgets.VBox(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.lower() in x.lower()][:10]
for name in close_matches:
if name not in experiments:
experiments[name] = widgets.Checkbox(description=name, value=False)
### 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
然后在您选择了几个选项后,调用 [key for key, exp_check in exp_checkboxes.items() if exp_check.value]
以查看所选值。
我构建了一个 jupyter notebook 来分析和对比历史数据。因为数据库非常大,所以我使用搜索 + 观察小部件来允许用户 select 他们想要的实验,而不是滚动浏览所有数据。现在,所有实验的所有复选框都已生成,但这既太大而无法放入框中,而且会占用大量时间。
有没有办法在默认情况下仅显示最后 10 个实验,并在搜索后仅生成所需的复选框?
我的代码基于此gist。我已经尝试将复选框小部件移动到 else 循环中,但这没有用。此外,global/local 变量情况在我的代码中似乎很混乱。
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 的答案与一些修改结合起来,它几乎可以完成所需的工作。唯一没有的是当搜索框一开始为空时显示默认值。之后,清除搜索框显示正确的行为。
import ipywidgets as widgets
#Generate a dummy list
Allfileslist = ["{}".format(x) for x in range(600)]
#Search box + generate some checboxes
search_widget = widgets.Text(placeholder='Type for older experiments', description= 'Search:',value='')
experiments = {}
options_widget = widgets.VBox(layout={'overflow': 'auto'})
default_options = [widgets.Checkbox(description=eachfilename, value=False) for eachfilename in Allfileslist[-10:]]
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 = default_options
else:
# Filter by search
close_matches = [x for x in Allfileslist if search_input.lower() in x.lower()][:10]
for name in close_matches:
if name not in experiments:
experiments[name] = widgets.Checkbox(description=name, value=False)
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')
multi_select
首先尝试创建一个空字典,然后在接近您想要的实验选择时填充复选框。
import ipywidgets as widgets
#Generate a dummy list
Allfileslist = ["{}".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}
experiments = {}
options_widget = widgets.VBox(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.lower() in x.lower()][:10]
for name in close_matches:
if name not in experiments:
experiments[name] = widgets.Checkbox(description=name, value=False)
### 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
然后在您选择了几个选项后,调用 [key for key, exp_check in exp_checkboxes.items() if exp_check.value]
以查看所选值。