проблема с обновлением выпадающего списка dash core

#python #plotly #plotly-dash

#python #сюжет #plotly-dash

Вопрос:

Я создал 2 выпадающих списка. оба они срабатывают по одной кнопке. 4 дня назад этот макет работал отлично. Но с нескольких дней назад запускается только один обратный вызов, а не другой. Я попытался разобраться в обратном вызове, который не запускался. Получается запуск обратного вызова, но он ничего не возвращает. Я пытался распечатать все до возврата того же обратного вызова. все печатается хорошо. Были ли внесены какие-либо изменения в основные компоненты?

 import numpy as np
import pandas as pd
import dash
import dash_table
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input,Output,State

app.scripts.config.serve_locally = True
app.config['suppress_callback_exceptions'] = True

app.layout = html.Div([
    html.Button('get attributes',id='get_attributes',n_clicks=0),    
    dcc.Dropdown(id="select_dep_var"),
    html.Div(id = 'store_dep_var'),
    dcc.Dropdown(id="drp1"),
    dcc.Dropdown(id="drp2"),        
   ])


@app.callback(Output('drp1','options'),
          [Input('get_attributes','n_clicks'),
           Input('select_dep_var','children')])
def drp1update(n_click,depend_var):
    if n_click > 0:
        if depend_var is not None:
            return [{'label': i, 'value': i} for i in data[depend_var].unique()]


@app.callback(Output('drp2','options'),
          [Input('get_attributes','n_clicks'),
           Input('select_dep_var','children')])
def drp2update(n_click,depend_var):
    if n_click > 0:
        if depend_var is not None:
            return [{'label': i, 'value': i} for i in data[depend_var].unique()]


@app.callback(Output('store_dep_var','children'),
              [Input('select_dep_var','value')])
def store_dep_var(dep_var):
    return dep_var


@app.callback(Output('select_dep_var','options'),
              [Input('get_attributes','n_clicks')])
def select_dep_var(click):
    if click >0:
        print('returning attributes in dropdown')
        print(click)
        print(data.columns)
        return [{'label': i, 'value': i} for i in data.columns]

if __name__ == '__main__':
    app.run_server(debug=True)
 

Ответ №1:

Похоже, что два ваших обратных вызова принимают неправильные входные данные, drp1update и drp2update . children Я думаю, они берут, select_dep_var но они должны брать value .

 @app.callback(Output('drp1','options'),
          [Input('get_attributes','n_clicks'),
           Input('select_dep_var','value')])
def drp1update(n_click,depend_var):
    if n_click > 0:
        if depend_var is not None:
            return [{'label': i, 'value': i} for i in data[depend_var].unique()]


@app.callback(Output('drp2','options'),
          [Input('get_attributes','n_clicks'),
           Input('select_dep_var','value')])
def drp2update(n_click,depend_var):
    if n_click > 0:
        if depend_var is not None:
            return [{'label': i, 'value': i} for i in data[depend_var].unique()]
 

Когда я внес это изменение, обратные вызовы сработали и обновили значения в двух других выпадающих списках. Я просто использовал фиктивный фрейм данных. Вероятно, вы также можете удалить n_clicks входные данные из обоих этих обратных вызовов, потому что значения из выпадающего списка будет достаточно, чтобы запустить их.