web-dev-qa-db-ja.com

IPythonノートブックウィジェットとSpyreのドロップダウンを動的に変更する

IPythonノートブック(HTMLウィジェットの一部として)とSpyreアプリ(dropdown要素として)にドロップダウンがあります。たとえば、大陸を選択し、選択するための2番目のドロップダウンを追加したいと思います。大陸内の国。これで、明らかに2番目のドロップダウン内のオプションは最初のドロップダウンの値に依存します。このUI要素を更新するコールバック関数を使用する便利な方法を見つけるのに苦労しています。

interact関数が1つあるIPythonノートブックでこれをほぼ実行し、呼び出された関数内で、2番目のドロップダウンを使用して2番目のinteract要素を作成します。ただし、最初のドロップダウンを変更すると、新しいドロップダウン要素が作成されるため、変更するたびに1つの追加のドロップダウンが作成されます。ただし、更新するドロップダウンは1つだけで、それだけです。

問題が明確であることを願っています。ありがとうございました。

15
Ondrej

interactiveの代わりにinteractを使用して、ウィジェットを更新します。

from IPython.html import widgets
from IPython.display import display

geo={'USA':['CHI','NYC'],'Russia':['MOW','LED']}

def print_city(city):
    print city

def select_city(country):
    cityW.options = geo[country]


scW = widgets.Select(options=geo.keys())
init = scW.value
cityW = widgets.Select(options=geo[init])
j = widgets.interactive(print_city, city=cityW)
i = widgets.interactive(select_city, country=scW)
display(i)
display(j)
20
ILoveCoding
import datetime
import ipywidgets as ipyw

from bokeh.models.widgets.inputs import AutocompleteInput
from IPython.display import display

dp1 = ipyw.Dropdown(options = ['Asia','Europe','Africa'])
dp2 = ipyw.Dropdown(options = ['India','China','Pakistan','Tibet'])
asia_list = ['India','China','Pakistan','Tibet']
europe_list = ['Germany','France','Italy']
africa_list = ['south africa','Nigeria','Kenya']
global_vbox = ipyw.VBox()
global_vbox.children = [dp1,dp2]
display(global_vbox)
def continent_change_event(x):
    global dp1
    global dp2
    list_name = dp1.value
    dp2.index = None #This line is very important for setting the values for widgets other than widget with observe method
    dp2.index = 0
    if(list_name == 'Asia'):
        dp2.options = asia_list
    Elif(list_name == 'Europe'):
        dp2.options = europe_list
    else:
        dp2.options = africa_list

dp1.observe(continent_change_event)
3

賛成票が最も多い回答は役に立ちますが、私には少し不器用に思えます。しばらく検索したところ、 Jupyter docs に基づいた答え here が私にとってより好ましいことがわかりました。私はそれらを適応させ、以下を提供します。

from ipywidgets import interact, Dropdown

geo = {'USA':['CHI','NYC'],'Russia':['MOW','LED']}
countryW = Dropdown(options = geo.keys())
cityW = Dropdown()

def update_cityW_options(*args): # *args represent zero (case here) or more arguments.
    cityW.options = geo[countryW.value]
cityW.observe(update_cityW_options) # Here is the trick, i.e. update cityW.options based on countryW.value.

@interact(country = countryW, city = cityW)
def print_city(country, city):
    print(country, city)

別の方法として、cityW.options関数内でprint_cityを更新できることもわかりました。これは、さらに明確な方法です。

from ipywidgets import interact, Dropdown

geo = {'USA':['CHI','NYC'],'Russia':['MOW','LED']}
countryW = Dropdown(options = geo.keys())
cityW = Dropdown()

@interact(country = countryW, city = cityW)
def print_city(country, city):
    cityW.options = geo[country] # Here is the trick, i.e. update cityW.options based on country, namely countryW.value.
    print(country, city)
2
Fei Yao

_widgets.interactive_を使用している場合:メイン関数の動的ウィジェットのオプションを更新します。

_import ipywidgets as widgets 
geo={'USA':['CHI','NYC'],'Russia':['MOW','LED']}

def main_function(city, country):
    print (f'{city} is a city in {country}')
    cityW.options = geo[country]    

scW = widgets.Select(options=geo.keys())
cityW = widgets.Select(options=geo[init])

widgets.interactive(main_function, city=cityW, country=scW)
_

注:これは、2つではなく1つのインタラクティブ機能しかないという点で、最高評価の回答とのみ異なります。ボーナス:メイン関数に修正パラメーターを渡したい場合は、name=widgets.fixed("Bob")ここを参照 )を使用します。

0
Qaswed