使用 ipywidgets 切换所有复选框?

Toggle all checkboxes with ipywidgets?

我正在使用 ipywidgets 的复选框以交互方式 select 要绘制的数据。

似乎没有开箱即用的“全部切换”功能。

所以我像这样实现了自己的“全部切换”:

import ipywidgets as widgets
def toggle_all(change):
    for cb in checkboxes[1:]:
        cb.value = checkboxes[0].value

def interactive_plot(change):
    selection = {}
    for cb in checkboxes[1:]:
        selection[cb.description] = cb.value
    #call some plot_function(data = data, selection = selection)

checkboxes = [widgets.Checkbox(value=False, description = "All"), widgets.Checkbox(value=False, description = "Box 1"), widgets.Checkbox(value=False, description = "Box 2")]
box = widgets.VBox(children = checkboxes)

checkboxes[0].observe(toggle_all)

for cb in checkboxes[1:]:
    cb.observe(interactive_plot)
display(box)

然而,当复选框被一个接一个地勾选时,这会导致闪烁,当复选框的数量很少时,这种情况几乎不会引起注意,但当列表增长时,就会变得缓慢而烦人。

有更好的方法吗?

Is there a better way to do this?

目前没有。这是一个悲伤的消息,但最大的好处是你找到了最好的方法:)

或者,您可以尝试使用 selectMultiple 小部件 (https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20List.html#SelectMultiple),但不会给您复选框。

ipywidgets 上还有一个老问题,讨论添加可以解决您问题的小部件类型:https://github.com/jupyter-widgets/ipywidgets/issues/893。但看起来它需要一个冠军才能真正实施它。