Вложенная Фильтрация С Использованием Ipywidgets

#python #python-3.x #pandas #widget #ipywidgets

Вопрос:

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

Вот набор игрушечных данных для целей репликации.

 toy_data = pd.DataFrame({"LETTER": ["A", "B", "A","B","A", "B", "A","B"],
               "PLANT": ["Orange", "Carrots", "Lemon","Potato","Pomelo","Yam","Lime","Radish"],
               "NUMBER": [1,2,3,4,5,6,7,8]})
 

Создание виджетов:

 letter_var = widgets.Dropdown(
    description="Letter: ",
    options=toy_data.LETTER.unique(),
    value="A",
)

def letter_filtering(change):
    clear_output(wait = True)
    letter = letter_var.value
    new_toy_data = toy_data[toy_data.LETTER == str(letter)]
    
    plant_var = widgets.Dropdown(description="Plant: ", options=new_toy_data.PLANT.unique(), value="Orange")
    
    return plant_var
 

функция letter_filtering предназначена для фильтрации вариантов в вигетах для растений. То есть, если для letter_var была выбрана буква B, то выбор в plant_var будет ограничен только буквой B. но при реализации,

 widgets.HBox([letter_var,letter_filtering])
 

Я получаю ошибку признака.

 TraitError: The 'children' trait of a HBox instance contains an Instance of a TypedTuple which expected a Widget, not the function 'letter_filtering'.
 

Я думаю, что не знаю, как это сделать.

Комментарии:

1. виджеты. HBox ожидает получить список виджетов. letter_var-это виджет, но letter_filtering-это функция. Вам необходимо определить виджет plant_var вне функции letter_filtering, и когда в виджете letter_var делается выбор, вы должны вызвать функцию letter_filtering при выборе, чтобы установить значение виджета plant_var. Как и сейчас, в то время как функция letter_filtering возвращает виджет (plant_var), функция никогда не вызывается! Если вы попытаетесь переписать свой код и обновить его здесь, я буду рад помочь вам, если у вас возникнут какие-либо проблемы. Надеюсь, это поможет!