Как обновить цепочку выпадающего значения в Da sh d cc? - PullRequest
1 голос
/ 03 марта 2020

В da sh, как мне обновить значения одного раскрывающегося списка в другой контрольный список или ползунок? В приведенном ниже коде я выбираю одно значение из раскрывающегося списка, которое должно обновлять значения контрольного списка на основе выбранного значения из раскрывающегося списка. Здесь я частично успешно получаю значение из выпадающего списка, но оно накапливается с более старыми выбранными значениями в контрольном списке . Ниже приведена часть кода.

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

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.config['suppress_callback_exceptions'] = True

app.layout = html.Div([
                dash_table.DataTable(
                        id='datatable-upload-container',
                        columns=[{"name": i, "id": i} for i in df.columns],
                        data=df.to_dict('records'),
                        ),
                html.Div(dcc.Dropdown(
                    id='data_selector1',
                    options=[
                        {'label': '', 'value': ''}
                        ],
                    value=[]
                    )
                ),
                html.Br(),
                html.Div([
                    html.Div(id='numerical-slider'),
                    # this is a hack: include a hidden dcc component so that
                    # dash registers and serve's this component's JS and CSS
                    # libraries
                     dcc.Input(style={'display': 'none'})
                ])
           ])

@app.callback(Output('data_selector1', 'options'),
              [Input('datatable-upload-container', 'data')])
def update_dropdown(rows):
    print('updating menus')
    numerical_col = [i for i in df.columns if df[i].dtypes != "object"]
    col_labels=[{'label' :k, 'value' :k} for k in numerical_col]
    return col_labels

@app.callback(Output('numerical-slider','children'),
              [Input('data_selector1', 'value'),
              Input('datatable-upload-container', 'data')])
def explanatory_cat_slider(value, rows):
    if value:
        categories, intervals = pd.cut(df[value], 3, retbins=True)
        return html.Div(html.Label([value,
                            dcc.RangeSlider(id='numerical-slider',
                               min=min(intervals),
                               max=max(intervals),
                               step=None,
                               marks={str(val): str(round(val,2)) for val in intervals},
                               value = [intervals[0],intervals[-1]]
                               )
                            ],style={'width': '50%', 'display': 'inline-block', 'textAlign': 'left'})
                        )
    else:
        return []

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

обновленный код ... У меня возникает проблема с объяснительной_каталогом , она не обновляется с новыми выбранными значениями.

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

Во втором изображении ползунки накапливаются друг на друге. Как я могу исправить эту проблему?

На последнем изображении, как перекрывается слайдер

1 Ответ

0 голосов
/ 04 марта 2020

Код, который вы опубликовали, является неполным, потому что у вас есть идентификатор ввода data_selector и идентификатор datatable-upload-container в вашем обратном вызове, но они не существуют в вашем layout. Я вижу, что у обратного вызова также будет проблема с его выводом, потому что он пытается обновить children из categorical-checklist с элементом, который содержит идентификатор того же самого. Это может привести к появлению неуникальных идентификаторов в макете, что приведет к поломке.

Возможно, я смогу помочь с полным кодом, но, по сути, у вас есть правильная идея проверить if value: и запустить свой код внутри этого блока. Убедитесь, что вы не позволяете обратному вызову молча завершаться, потому что это вернет None и вызовет проблемы для вас. Вы должны включить return [] или return '' в конце или внутри блока else: для защиты от этого и поддерживать компонент children в силе, даже если только с пустым значением.

Вы также должны включить dcc.Checklist в свой первоначальный макет. Дайте ему options=[] для начала, и ваш обратный вызов обновит его options prop. Это должно сработать, но, если проблемы не устранены, обновите опубликованный код, и я еще раз посмотрю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...