Как вызвать функцию с использованием Da sh с обратным вызовом с использованием входов / состояний, которые явно не определены как входные - PullRequest
0 голосов
/ 29 января 2020

Я использую Da sh для чтения из JSON и создания ряда полей ввода на основе данных, которые он принимает, и визуализации результатов. Я хотел бы иметь функцию, которая будет создавать JSON, когда форма отправляется нажатием кнопки, принимая значения всех полей ввода в качестве состояний.

import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
import plotly.graph_objects as go
import json

app=dash.Dash
output = []
in2 = []


for (x,y) in data.items():
    in2.append(State(x, 'value'))
    output.append(html.Label(y['constraint_name']))
    if y['constraint_type']=='fs':
        output.append(dcc.RadioItems(id=x,
                                    options=[
                                        {"label" : "On", "value" : "On"},
                                        {"label" : "Off", "value" : "Off"}
                                    ],
                                    value = "On"
                                    ),)
    elif y['constraint_type']=='dur':
        output.extend((html.Br(),dcc.Input(id=x,
                                        type='number',
                                           value=10,
                                        min=0
                               ), html.Label("People ")))
    output.extend((html.Br(), html.Br()))

output.append(html.Button('Submit', id='submit'))
output.append(html.Div(id="div2"))

app.layout = html.Div(output, style={'width': '44%', 'display': 'inline-block', 'vertical-align': 'top'})

@app.callback(
    Output(component_id='div2', component_property='children'),
    in2
)
def update_output_div(input_value):
    teststring1 = ""
    for val in input_value:
        teststring1 += val

    return 'You\'ve entered "{}"'.format(teststring1)

Приложение не запускается с обратным вызовом в вышеуказанном состоянии, но примет список in2, если оно имеет Input('1','value'). Как я могу заставить это работать?

1 Ответ

1 голос
/ 29 января 2020

Ключевым моментом здесь является передача вашего состояния в списке в качестве третьего параметра. Правило состоит в том, что выводит go в качестве первого параметра, вводит в качестве второго и указывает третий. И входы, и состояния должны передаваться в списках. Кроме того, вы должны убедиться, что для каждого входа и состояния ваша функция обратного вызова должна принимать параметр. Так что в вашем случае вы должны сделать что-то вроде этого:

@app2.callback(
    Output(component_id='div2', component_property='children'),
    [Input('1', 'value')],
    [State('2', 'value')]
)
def update_output_div(input_value1, input_value2):
    ....

Имейте в виду, что если у вас есть второе входное значение в качестве состояния, оно не вызовет функцию обратного вызова при изменении. Чтобы он вызывал обратный вызов при изменении, он должен быть объявлен как вход и помещен в список вместе с другим входом.

...