破折号,带有2个按钮输入和一个下拉输入的回调

时间:2019-01-04 15:26:56

标签: python plotly-dash

我该如何编写一个回调,以便在单击按钮1时执行A;如果单击按钮2,则执行B;如果下拉值发生变化,可以执行C吗?

import dash
import dash_core_components as dcc
import dash_html_components as html

app = dash.Dash(__name__)
app.layout = html.Div([
        html.H1('initial', id = 'h1'),
        html.Button('to upper', id = 'upper button', n_clicks_timestamp = '0'),
        html.Button('to lower', id = 'lower button', n_clicks_timestamp = '0'),
        dcc.Dropdown(options = [{'value':s, 'label': s} for s in ['good','bad']], value = 'good', id = 'set string')
    ])

@app.callback(
         dash.dependencies.Output('h1', 'children'),
         [dash.dependencies.Input('upper button', 'n_clicks_timestamp'), 
          dash.dependencies.Input('lower button', 'n_clicks_timestamp'), 
          dash.dependencies.Input('set string', 'value')],
         [dash.dependencies.State('h1', 'children')]
    )
def update(upper, lower, newstring, currentstring):
    upper, lower = int(upper), int(lower)

    # ???
    # if dropdown changed, return newstring
    # ???

    if upper > lower:
        return currentstring.upper()
    if lower > upper:
        return currentstring.lower()

    return newstring

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

由于下拉列表没有timestamp属性,因此无法确定是否为最新更改。

1 个答案:

答案 0 :(得分:1)

在回调中是否会多次按下按钮?如果不是,则当下拉菜单触发回调时,按钮将以n_clicks的形式显示0,以n_clicks_timestamp的形式显示None(或者不显示,也为0)。因此,您可以通过消除过程来推断下拉列表触发了回调。

如果多次按下按钮,则需要在包含按钮的Div的children属性上创建另一个回调,并只需重新实例化按钮,使其仍为0 n_clicks和下一个回调的时间戳。