2016-06-03 1 views
3

사용자가 슬라이더 위젯을 변경할 때 줄거리의 데이터를 변경하기 위해 jupyter 노트북의 ipywidgets와 대화식 슬라이더를 만들려고합니다. 간단하며 예제 코드를 쉽게 찾을 수 있습니다. 내가 가진 문제는 두 가지입니다 : 1) 많은 매개 변수 (= 변수, 슬라이더)가 표시 될 때 함수에서 슬라이더가 수직으로 정렬되어 jupyter 페이지를 스크롤하지 않고 컨트롤하기가 어려워집니다. 슬라이더를 정렬 할 수있는 방법이 있습니까? 2) 많은 정수/부동 소수점 슬라이더를 전달하기 위해 하나의 사전을 대화 형 함수로 전달했습니다. 여기서 키 (= 슬라이더/변수/매개 변수) 이름은 겉보기에 무작위 순서로 표시됩니다. 사전에 키 이름별로 정렬 한 후 사전을 전달하려고했지만 여전히 문제가 해결되지 않습니다.ipywidgets 대화 형 위젯 (슬라이더)에서 키 이름을 정렬하는 방법?

아이디어를 공유해 주시면 감사하겠습니다.

def myfun(**var_dict): 
    v = [value for value in var_dict.values()] 
    return np.sum(v) 

var_dict = {'var1':1,'var2':2,'var3':3,'var4':4} 
w = interactive(myfun,**var_dict) 
display(w) 

ipywidgets interactive sliders

+0

는 [주문 딕셔너리 (https://docs.python.org/2/library/collections.html#collections 사용을 고려 :-) 즐길 수 있습니다. OrderedDict)? – nluigi

+0

OrderedDict를 시도했지만, 파이썬의 함수 호출 의미론이 정렬되지 않은 정규 사전을 사용하여 키워드 인수를 전달하기 때문에 가능하지 않았습니다. –

답변

3

당신은 ** kwargs로를 사용하여이 문제를 해결 할 수 없습니다. PEP468 "[키워드 인수]가 작동하지 않는 유일한 이유는 인터프리터가 해당 주문 정보를 폐기하기 때문입니다." 그래서 당신은이 동작을 얻으려면

"함수에게 건네지는 버전 3.5에서 시작하면 파이썬은 키워드 인자의 순서를 유지한다"당신이해야 하나 : 이름은 '대화'를 사용하여 인수를 :

from ipywidgets import interactive 
from IPython.display import display 
import numpy as np 
def myfun(**kwargs): 
    return np.sum(list(kwargs.itervalues())) 
w=interactive(myfun,var1=1,var2=2,var3=3,var4=4) 
display(w) 

또는 실제로 dict을 사용하고 싶다면 '대화식'을 사용하지 않고 위젯을 직접 작성하는 것이 가장 좋습니다. 이 이런 식으로 할 수있는 :

from IPython.display import display,clear_output 
from ipywidgets import widgets 
from collections import OrderedDict 
var_dict = OrderedDict([('var1',1),('var2',2),('var3',3),('var4',4)]) 

def myfct(change,list_widgets): 
    clear_output() 
    print np.sum([widget.value for widget in list_widgets]) 

list_widgets=[] 

# create the widgets 
for name,value in var_dict.iteritems(): 
    list_widgets.append(widgets.IntSlider(value=value,min=value-2,max=value+2,description=name)) 

# link the widgets with the function 
for widget in list_widgets: 
    widget.observe(lambda change:myfct(change,list_widgets),names='value',type='change') 

# group the widgets into a FlexBox 
w = widgets.VBox(children=list_widgets) 

# display the widgets 
display(w) 

+0

옵션 1 ("interactive"를 사용할 때 인수에 이름 붙이기)은 python 3.5.2, ipython 5.1.0 및 ipywidgets 5.2.2를 사용할 때 안정적으로 작동하지 않습니다. jupyter 노트북의 커널을 다시 시작한 후에 위젯의 순서가 임의로 변경됩니다. –

관련 문제