вызов функции, которая показывает список подкатегорий в поле выбора с использованием функции наблюдения, работает только в первый раз - PullRequest
1 голос
/ 01 ноября 2019

У меня простой df есть основная категория и ее подпункты. Я сделал два поля выбора, чтобы выбрать основную категорию, и он автоматически отображает принадлежащие элементы в другом окне выбора, используя «наблюдать». Но он работает только при первом выборе категории, а после выбора другой категории он не отображает вложенные элементы в другой. выберите поле.

Если я поставлю «наблюдаю» внутри «def», функция будет работать так, как я хотел. Но такой подход проблематичен, если у меня есть много других «def», выполняющих наблюдение за изменениями. Я также ищу способ сделать этот код простым без использования глобальных. А также приветствуем любые идеи, чтобы сделать этот код проще и легче.

import pandas as pd
import ipywidgets as wg
from ipywidgets import *
from IPython.display import display, clear_output
df_list=[{'Category':'fruit','name':['banana','apple','mango']},\
         {'Category':'animal','name':['lion','monkey','tiger','cat','dog']},\
         {'Category':'body','name':['eyes','hands','ears','arms']},\
         {'Category':'office','name':['table','computer','printer']}]
df=pd.DataFrame(df_list)

Category_box=wg.Select(options=list(df.Category),continuous_update=False,layout=Layout(width='30%'))
name_box=wg.Select(options=list(df[df['Category']==Category_box.value].name)[0],continuous_update=False,\
                   layout=Layout(width='30%'))
hbox=wg.HBox(children=[Category_box,name_box])
display(hbox)

def select_on_change(change):
    if change['name'] == 'value':
        global Category_box
        global name_box
        global hbox
        Category_box=wg.Select(options=list(df.Category),continuous_update=False,layout=Layout(width='30%'),value=Category_box.value)
        name_box=wg.Select(options=list(df[df['Category']==Category_box.value].name)[0],continuous_update=False,\
                   layout=Layout(width='30%'))
        hbox=wg.HBox(children=[Category_box,name_box])
        clear_output()
        display(hbox)
    #Category_box.observe(select_on_change)


Category_box.observe(select_on_change)

1 Ответ

0 голосов
/ 01 ноября 2019

Во-первых, спасибо за полный и понятный пример.

Решение состоит в том, чтобы не создавать новые виджеты в вашей функции, которые вы наблюдаете. Вместо этого просто обновите .options вашего name_box виджета. Таким образом, глобалы не требуются.

import pandas as pd
import ipywidgets as wg
from ipywidgets import *
from IPython.display import display, clear_output
df_list=[{'Category':'fruit','name':['banana','apple','mango']},\
         {'Category':'animal','name':['lion','monkey','tiger','cat','dog']},\
         {'Category':'body','name':['eyes','hands','ears','arms']},\
         {'Category':'office','name':['table','computer','printer']}]
df=pd.DataFrame(df_list)

Category_box=wg.Select(options=list(df.Category),continuous_update=False,layout=Layout(width='30%'))
name_box=wg.Select(options=list(df[df['Category']==Category_box.value].name)[0],continuous_update=False,\
                   layout=Layout(width='30%'))
hbox=wg.HBox(children=[Category_box,name_box])
display(hbox)

def select_on_change(change):
    if change['name'] == 'value':
        name_box.options = list(df[df['Category']==Category_box.value].name)[0]


Category_box.observe(select_on_change)
...