2016-01-22 41 views
4

我正在使用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個滑塊。我怎樣才能避免這種情況?

回答

0

經歷了一段令人沮喪的一天之後,我想出了一個徹頭徹尾的方法來解決這個問題(但至少它達到了我想要的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)) 
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)) 
0

這裏是另一個解決方案,您可以創建兩個滑塊,使「最大「取決於使用第一滑塊選擇的屬性:

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) 
相關問題