Plotly Dash: автоматическая отправка после заполнения последнего поля ввода / всей формы - PullRequest
0 голосов
/ 17 октября 2019

В настоящее время я настроил страницу так, чтобы она принимала 3 входа и возвращала статус (прошел / не прошел) после нажатия кнопки отправки. Тем не менее, я хотел бы сделать процесс ввода данных более эффективным, автоматически отправляя после заполнения последнего поля. Есть ли способ сделать это с моими текущими настройками, используя формы начальной загрузки или селен?

edit: Selenium, возможно, здесь не подходит. Как насчет Flask-WTF? Я совсем не знаком с Flask, но поскольку Dash построен поверх Flask, мой код может быть легко интегрирован поверх приложения Flask.

Код ниже:

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

app.css.append_css({
    'external_url': 'https://codepen.io/chriddyp/pen/bWLwgP.css 104'
})


def update_database(star, serial, weight, andon):
    sheet.append([datetime.now(), star, serial, weight, andon])
    raw.save(r'Unit weights_test.xlsx')


def compare_tol(star, serial, weight):
    if star is not '':
        compare_group = df_main.loc[star, 'Group']
        if float(weight) > float(df_groups.loc[compare_group, 'Upper']) or \
                float(weight) < float(df_groups.loc[compare_group, 'Lower']):
            andon = 'FAIL'
        else:
            andon = 'PASS'
    else:
        andon = '...'
    update_database(star, serial, weight, andon)
    return andon


def which_entry(label, af):
    layout = html.Div([
        dcc.Input(
            id=label,
            placeholder=f' {label}...',
            type='text',
            value='',
            autoFocus=af
        )
    ], style={'padding': '5px 5px'})
    return layout


def andon_color(andon, n_blur):
    if n_blur:
        if andon == 'PASS':
            return 'success'
        elif andon == 'FAIL':
            return 'warning'
    else:
        return 'secondary'


app.layout = html.Div([
    html.Div([
        html.Img(src='http://www.image.png',
                 width='250px')
    ]),
    html.Div([
        html.Div([
           html.H3('Scan Star Number'),
        ]),
        which_entry('Star Number', True),
        html.Div([
            html.H3('Scan Serial Number')
        ]),
        which_entry('Serial Number', False),
        html.Div([
            html.H3('Enter Unit Weight')
        ]),
        which_entry('Weight', False),
    ], style={'text-align': 'center'}),
    html.Div([
            dbc.Button('Submit', id='button', color='primary')
    ], style={'text-align': 'center',
              'width': '250px'}),
    html.Div([
        dbc.Alert(id='andon', color='secondary')
    ], style={'text-align': 'center',
              'width': '250px',
              'padding': '5px 5px'})
], style={'width': '250px'})


@app.callback(
    [
     Output('andon', 'children'),
     Output('andon', 'color'),
     Output('Star Number', 'value'),
     Output('Serial Number', 'value'),
     Output('Weight', 'value')
    ],
    [
     Input('Weight', 'n_blur')
    ],
    [
     State('Star Number', 'value'),
     State('Serial Number', 'value'),
     State('Weight', 'value')
    ]
)
def output_all(n_blur, star, serial, weight):
    if not n_blur:
        raise dash.exceptions.PreventUpdate
    andon = compare_tol(star, serial, weight)
    return andon, andon_color(andon, n_blur), '', '', ''


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