сюжетное тире, обратный вызов с 2 кнопками ввода и раскрывающимся списком

Как я могу написать обратный вызов, чтобы при нажатии кнопки 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, невозможно определить, является ли это последним изменением.


person jf328    schedule 04.01.2019    source источник


Ответы (1)


Нужно ли нажимать кнопки несколько раз в обратном вызове? В противном случае, когда обратный вызов запускается раскрывающимся списком, кнопки будут иметь 0 как n_clicks и None (или также 0, я не помню) как n_clicks_timestamp. Таким образом, вы можете сделать вывод, что раскрывающийся список вызвал обратный вызов, путем исключения.

Если кнопки нажимаются несколько раз, вам необходимо создать еще один обратный вызов для свойства children элемента Div, содержащего кнопки, и просто повторно создать экземпляры кнопок, чтобы они по-прежнему находились на уровне 0 n_clicks и отметке времени для следующего обратного вызова. .

person giobatta912    schedule 10.01.2019
comment
Спасибо. Не уверен, что вы имеете в виду под повторным созданием кнопок. Можете ли вы установить свойство кнопки, когда вы выводите что-то другое? - person jf328; 10.01.2019
comment
У вас может быть несколько обратных вызовов с одним и тем же входом. Я говорю, что у вас есть обратный вызов для свойства children контейнера кнопок, и если метка времени кнопки не равна None, вы просто повторно визуализируете кнопки, возвращая их в обратном вызове. В противном случае вы просто поднимете PreventUpdate при втором обратном вызове. - person giobatta912; 11.01.2019
comment
Теперь я понимаю. Спасибо. - person jf328; 11.01.2019
comment
@ giobatta912 некоторый пример кода здесь был бы полезен (для новичков вроде меня) :) - person BrendanSimon; 17.09.2020