多个交互()命令在IPython中复制窗口小部件
问题描述:
我正在使用IPython Jupyter笔记本。在以下情况下,我使用interact()
调用函数,然后使用interact()
再次调用第二个函数。多个交互()命令在IPython中复制窗口小部件
def fun1(dataset_id):
dataset = read_dataset(dataset_id)
interact(fun2, data=dataset, var=(0,dataset.property,0.1))
def fun2(data, var):
# something
interact(fun1, dataset_id=(0,5,1))
第一运行此时,显示2级滑块的小部件:一个用于dataset_id
,和一个用于可变var
。但是,如果我改变dataset_id
滑块一次,则在第一个var
滑块下面添加第二个滑块var
,所以现在我总共有3个滑块。我怎样才能避免这种情况?
答
经历了一段令人沮丧的一天之后,我想出了一个彻头彻尾的方法来解决这个问题(但至少它达到了我想要的100%)。我添加了一个按钮,单击它时,会在第二个滑块上以及按钮本身上调用.close()
。因此,之前每次我需要移动第一个滑块,我按此按钮清除。
这是一个基于问题片段的功能完整的代码,您可以复制粘贴到您的解释器中。
from ipywidgets import *
from IPython.display import display
datasets=[{"property":1},{"property":2},{"property":3},{"property":4},{"property":5}]
def read_dataset(dataset_id):
return datasets[dataset_id]
def fun1(dataset_id):
dataset = read_dataset(dataset_id)
sliders = interactive(fun2, data=fixed(dataset), var=(0,dataset["property"],0.1)) # note I am now using interactive, instead of interact, because I need the close() function
close_button = widgets.Button(description="Remove sliders")
def remove_sliders(b):
sliders.close()
b.close()
close_button.on_click(remove_sliders)
display(sliders)
display(close_button)
def fun2(data, var):
print
# something
interact(fun1, dataset_id=(0,5,1))
答
这只是一个步骤少哈克,但至少你不必有一个按钮:
from ipywidgets import *
from IPython.display import display
datasets=[{"property":1},{"property":2},{"property":3},{"property":4},{"property":5}]
def read_dataset(dataset_id):
return datasets[dataset_id]
def fun1(dataset_id):
global sliders
try:
sliders.close()
except NameError:
pass
dataset = read_dataset(dataset_id)
sliders = interactive(fun2, data=fixed(dataset), var=(0,dataset["property"],0.1)) # note I am now using interactive, instead of interact, because I need the close() function
display(sliders)
def fun2(data, var):
print var
interact(fun1, dataset_id=(0,5,1))
答
这里是另一个解决方案,您可以创建两个滑块,使“最大“取决于使用第一滑块选择的属性:
import ipywidgets as widgets
from ipywidgets import *
from IPython.display import display
datasets=[{"property":1},{"property":2},{"property":3},{"property":4},{"property":5}]
def read_dataset(dataset_id):
return datasets[dataset_id]
w_slider1 = IntSlider(min=0, max=len(datasets)-1, step=1)
w_slider2 = FloatSlider(min=0, step=0.1)
def fun1(dataset_id):
dataset = read_dataset(dataset_id)
#you could get rid of function "read_dataset"
#dataset = datasets[dataset_id]
w_slider2.max = dataset['property']
def fun2(data, var):
#call fun1 to update the size of 2nd slider
fun1(data)
#do something
print(data, var)
interact(fun2, data=w_slider1, var=w_slider2)