9

IPython でウィジェットを使用しています。これにより、ユーザーはフレーズを繰り返し検索し、別のウィジェット (選択ウィジェット) で結果 (異なるタイトル) を表示してから、結果の 1 つを選択できます。

要するに:

search_text = widgets.Text(description = 'Search') 
search_result = widgets.Select(description = 'Select table')

def search_action(sender):
    phrase = search_text.value
    df = search(phrase) # A function that returns the results in a pandas df
    titles = df['title'].tolist()
    search_result.options = titles

search_text.on_submit(search_action)

これは以前は正常に機能していましたが、ipywidgets の最新バージョン (4.0.1 から 5.1.3) に更新した後は、次のようになります。

search_selection.options = titles

次のエラーを生成します (1 つまたは両方、状況によって異なります)。

TraitError: Invalid selection
TypeError: 'list' object is not callable

他のウィジェットからの検索に基づいた結果でウィジェットが更新されるという意味では引き続き機能しますが、エラーが発生します。

別のウィジェットからの結果に基づいて、あるウィジェットでオプションを設定する正しい方法は何ですか?

(編集:より詳細なエラーメッセージを追加)

4

4 に答える 4

5

1時間前にこの正確な問題に遭遇しました。私自身の要件は動的にリンクされたリストを持つことだったので、ここで最小の例を使用してソリューションをハックしました: IPython ノートブック ウィジェットと Spyre でドロップダウンを動的に変更します。このソリューションを使用して、要件を適応させることができると確信しています。

重要なのは、すべてのドロップダウン/選択を事前に生成することです。何らかの理由で、w.options = l設定のみw._options_labelsw.options. の選択された値のその後の検証は、w恐ろしく失敗します。

import ipywidgets as widgets
from IPython.display import display

geo={'USA':['CHI','NYC'],'Russia':['MOW','LED']}
geoWs = {key: widgets.Select(options=geo[key]) for key in geo}

def get_current_state():
    return {'country': i.children[0].value,
            'city': i.children[1].value}

def print_city(**func_kwargs):
    print('func_kwargs', func_kwargs)
    print('i.kwargs', i.kwargs)
    print('get_current_state', get_current_state())

def select_country(country):
    new_i = widgets.interactive(print_city, country=countryW, city=geoWs[country['new']])
    i.children = new_i.children

countryW = widgets.Select(options=list(geo.keys()))
init = countryW.value
cityW = geoWs[init]

countryW.observe(select_country, 'value')

i = widgets.interactive(print_city, country=countryW, city=cityW)

display(i)

最後に、ウィジェットの最新の状態を取得するのは簡単ではないことに注意してください。これらは

  • を介して、子の値から直接get_current_state。これは信頼できます。
  • インタラクティブなインスタンスからi.kwargs
  • 提供された引数からprint_city

後者の 2 つは、さまざまな理由で時代遅れになっていることがあります。

お役に立てれば。

于 2016-05-11T02:58:59.480 に答える
5

への割り当て中に の通知を保持できますoptions:

with search_result.hold_trait_notifications():
    search_result.options = titles

したがって:

search_text = widgets.Text(description = 'Search') 
search_result = widgets.Select(description = 'Select table')

def search_action(sender):
    phrase = search_text.value
    df = search(phrase) # A function that returns the results in a pandas df
    titles = df['title'].tolist()
    with search_result.hold_trait_notifications():
        search_result.options = titles

以下のhmelbergの説明を参照してください

「エラーの原因は、ウィジェットにも値プロパティがあり、その値がオプションの新しいリストにない可能性があることです。このため、ウィジェットの値が短時間「孤立」し、エラーが発生する可能性があります。」

于 2016-06-07T14:47:53.913 に答える
0

エラーの原因は、ウィジェットにも値プロパティがあり、その値がオプションの新しいリストにない可能性があることです。このため、ウィジェットの値が短時間「孤立」し、エラーが発生する場合があります。

解決策は、ウィジェット値をウィジェットに割り当てる前にオプション リストに割り当てるか (必要に応じて値/オプションを削除する)、または Dan が書いているように: create a hold_trait-notifications() を使用することです。

ダンのアプローチは最高です。上記は、問題の原因を説明しているだけです。

于 2016-06-08T16:29:43.980 に答える