IPythonノートブック(HTMLウィジェットの一部として)とSpyreアプリ(dropdown
要素として)にドロップダウンがあります。たとえば、大陸を選択し、選択するための2番目のドロップダウンを追加したいと思います。大陸内の国。これで、明らかに2番目のドロップダウン内のオプションは最初のドロップダウンの値に依存します。このUI要素を更新するコールバック関数を使用する便利な方法を見つけるのに苦労しています。
interact
関数が1つあるIPythonノートブックでこれをほぼ実行し、呼び出された関数内で、2番目のドロップダウンを使用して2番目のinteract
要素を作成します。ただし、最初のドロップダウンを変更すると、新しいドロップダウン要素が作成されるため、変更するたびに1つの追加のドロップダウンが作成されます。ただし、更新するドロップダウンは1つだけで、それだけです。
問題が明確であることを願っています。ありがとうございました。
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)
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)
賛成票が最も多い回答は役に立ちますが、私には少し不器用に思えます。しばらく検索したところ、 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)
_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")
( ここを参照 )を使用します。