Добавьте функцию обратного вызова в приложение da sh, чтобы получить фрейм данных всех блоков ввода и их значений. - PullRequest
0 голосов
/ 04 марта 2020

У меня есть приложение da sh, которое выглядит следующим образом enter image description here

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

Как мне написать обратный вызов для этого? Вот мой код

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

external_stylesheets = [
    'https://codepen.io/chriddyp/pen/bWLwgP.css',
    "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css",
    "https://use.fontawesome.com/releases/v5.7.2/css/all.css"
]

import pandas as pd
import requests

needed_inputs = ['Year', 'Index', 'Value']

app = dash.Dash(__name__, external_stylesheets=[external_stylesheets, dbc.themes.BOOTSTRAP])

app.config.suppress_callback_exceptions = True

app.layout = html.Div([ 

    dcc.Location(id='url', refresh=False),


    html.Div([  

        html.Br(),

        html.A('Home', href = '/menu-1', id='sidemenu-1'),
        html.A('Menu', href = '/menu-2', id='sidemenu-2')

    ], className = 'sidenav'),

    html.Div(id='page-content', className='main')
])


calc_layout =  html.Div([

    html.Br(),

    html.Div([
        dcc.Input(id='years-input', type='number', placeholder='Please enter years'),
        html.Button(id='years-submit-button', n_clicks=0, children='Submit')
    ]),

    html.Br(),

    html.Div(id='calc-inputs', className='six columns'),

    html.Br(),

    html.Div([

        html.Div(id='inputs-table', className='six columns')

    ], className = 'row')

])

@app.callback(
    Output('calc-inputs', 'children'),
    [Input("years-submit-button", 'n_clicks')],
    [State('years-input', 'value')])
def show_inputs(n_clicks,value):
    if(type(value) == int):
        return [
            html.Div(
                [
                    dcc.Input(id=f'years-{i}-{j}', type='number', placeholder=f'{j}') for j in needed_inputs
                ] 
            ) for i in range(value)
        ] + [html.Br(), html.Button(id='data-submit-button', children='Send', n_clicks=0)]


@app.callback(dash.dependencies.Output('page-content', 'children'),
              [dash.dependencies.Input('url', 'pathname')])
def display_page(pathname):
    if pathname == '/menu-1':
        return calc_layout

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