Необходимо дважды нажать кнопку Da sh для обратного вызова с несколькими выходами - PullRequest
1 голос
/ 26 мая 2020

TL; DR : загрузка, вызванная обратным вызовом кнопки в приложении python3 Da sh, начинается только после второго щелчка. Не в первый раз ..

Full : я новичок в создании веб-приложений с Da sh в Python3 .8, и я хотел бы, чтобы мое приложение загрузило Excel файл после нажатия кнопки. В идеале, когда загрузка начинается, на кнопке также должен отображаться цвет success. Следовательно, я использую несколько Output с n_clicks как Input. С базовым фрагментом кода я получаю следующее поведение моего приложения:

  1. 1-й щелчок: кнопка становится зеленой (success) - нет начинается загрузка
  2. 2-й щелчок: теперь начинается загрузка (или открывается окно загрузки) - кнопка остается зеленой
  3. 2> щелчки: окно загрузки открывается при каждом нажатии, кнопка остается зеленой (или обновляется, не уверен)

Это не то поведение, которого я ожидал, я бы хотел начать загрузку уже после первого щелчка! У меня есть этот фрагмент кода в моем макете da sh:

html.Div(
  id="select-upload-form",
  style={
    "width": "100%",
    "marginBottom": "1rem",
    "justifyContent": "center",
    "alignItems": "center",
    "verticalAlign": "middle",
    "textAlign": "center",
  },
  children=[
    dbc.Button(
      "Download the upload form",
      id="download-excel",
      color="secondary",
      external_link="true",
      target="",
      href="",
    ),
  ],
),

и следующий обратный вызов:

@app.callback(
    [
        Output("download-excel", "href"),
        Output("download-excel", "color"),
        Output("download-excel", "target"),
    ],
    [Input("download-excel", "n_clicks")],
)
def download_excel_file(n_clicks):
    if n_clicks:
        excelfile = write_excel_file()  # creates an excel file using Pandas
        excelfile.seek(0)
        media_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        data = base64.b64encode(excelfile.read()).decode("utf-8")
        href_data = f"data:{media_type};base64,{data}"

        return href_data, "success", href_data,
    else:
        return None, "secondary", None
...