Множественный ввод в один вывод в Dash

#python #plotly-dash

#python #plotly-dash

Вопрос:

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

 app = dash.Dash()

app.layout = html.Div([
    html.H1("Input new address"),
    dcc.Input(
        id = 'Property_name',
        placeholder='Property Name',
        type = 'text',
        value = '',
    ),
    dcc.Input(
        id = 'Stree_name',
        placeholder='Street Name',
        type = 'text',
        value = '',
    ),
    dcc.Input(
        id = 'City',
        placeholder = 'City',
        type = 'text',
        value = '',
        ),
    dcc.Input(
        id = 'Zip_code',
        placeholder = 'Zip code',
        type = 'text',
        value = '',
        ),
    dcc.Input(
        id = 'Country',
        placeholder = 'Country',
        type = 'text',
        value = '',
        ),
    html.Button(id='Submit_address', n_clicks=0, children='Submit'),
    html.Br(),
    html.Div(id = 'address'),
    ])


@app.callback([
    Output('address', 'children')],
    [Input('Property_name', 'value'),
     Input('Stree_name', 'value'),
     Input('City', 'value'),
     Input('Zip_code', 'value'),
     Input('Country', 'value')
     ])

def update_map(n_clicks, address):
    if n_clicks is None:
        return dash.no_update
    else:
        return f"Added new address at GeoCords: {address}"

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

Ответ №1:

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

 @app.callback(
    [Output('address', 'children'],
    [Input('Submit_address', 'n_clicks')],
    [State('Property_name', 'value'),
     State('Stree_name', 'value'),
     etc.
    ])
def update_children(n, prop_name, stree_name, etc.):
    [your function here]
  

Не тестировал код, но именно так я сделал это в своем проекте. Это вам помогает?

Редактировать:

Вот, пожалуйста, этот код работает. Вам просто нужно отредактировать функцию, чтобы вывести нужную строку.

 import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Output, State
from dash import dash

app = dash.Dash()

app.layout = html.Div([
    html.H1("Input new address"),
    dcc.Input(
        id='Property_name',
        placeholder='Property Name',
        type='text',
        value='',
    ),
    dcc.Input(
        id='Stree_name',
        placeholder='Street Name',
        type='text',
        value='',
    ),
    dcc.Input(
        id='City',
        placeholder='City',
        type='text',
        value='',
    ),
    dcc.Input(
        id='Zip_code',
        placeholder='Zip code',
        type='text',
        value='',
    ),
    dcc.Input(
        id='Country',
        placeholder='Country',
        type='text',
        value='',
    ),
    html.Button(id='Submit_address', n_clicks=0, children='Submit'),
    html.Br(),
    html.Div(id='address'),
])


@app.callback(
    [Output('address', 'children')],
    [Input('Submit_address', 'n_clicks')],
    [State('Property_name', 'value'),
     State('Stree_name', 'value'),
     State('City', 'value'),
     State('Zip_code', 'value'),
     State('Country', 'value')])
def update_map(n_clicks, prop_name, street, city, zip, country):
    print(prop_name)
    return [html.Div(f"Added new address at GeoCords: {prop_name}")]


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

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

1. State похоже, в Dash этого нет

2. Ah State находится в dash.dependencies.State . К сожалению, это не работает, хотя

3. Спасибо за это, к сожалению, по-прежнему не выдает никаких результатов после нажатия кнопки отправки.

4. Это было сделано в моем тестовом проекте, убедитесь, что все зависимости установлены и что вы поместили любой текст в первое поле, которое я использовал для демонстрации. Если поле имеет значение emtpy, в нем будет указано только «Добавлен новый адрес в геокордах:»

5. Я протестирую это 🙂 Хотя он даже не показывает бит «Добавлен новый адрес в GeoCords:».