将元组返回到多个 dcc.Download 输出时出错

Error when returning a tuple to multiple dcc.Download Outputs

该示例是我的应用程序的显着简化版本。

该应用程序正常运行,但在启动时,它会抛出以下回溯。

我正在尝试 return 一个 dcc.Download 的元组到两个不同的输出。我试过解包元组并将每个元素也放在 return 中,但仍然出现相同的错误。

我不明白的是,当我实际上是 return 一个元组时,它是如何声明我 return 一个 None 类型的。

回溯:

dash._grouping.SchemaTypeValidationError: Schema: [<Output `rprt1.data`>, <Output `rprt2.data`>]
Path: ()
Expected type: (<class 'tuple'>, <class 'list'>)
Received value of type <class 'NoneType'>: None

功能代码:

import dash
from dash import html, Input, Output
from dash import dcc
import pandas as pd

app = dash.Dash(__name__)

app.layout = html.Div([
    dcc.Download(id='rprt1'),
    dcc.Download(id='rprt2'),
    html.Button('A', id='button', n_clicks=0)
])

def multi_dnwld(df1, df2, names):
    tup = (df1, df2)
    dwnld = []
    for df, name in zip(tup, names):
        filename = name + ' - ' + '.csv'
        dwnld.append(dcc.send_data_frame(df.to_csv, filename, index=False))
    dwnld = tuple(dwnld)
    return dwnld

df1 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])
df2 = pd.DataFrame([[1,2],[3,4]], columns = ['a', 'b'])

@app.callback(
    Output('rprt1', 'data'),
    Output('rprt2', 'data'),
    Input('button', 'n_clicks'),
    prevent_initial_callback=True
)
def summary(n_clicks):
    if n_clicks>0:
        names = ['Sum1', 'Sum2']
        return multi_dnwld(df1, df2, names)

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

n_clicks 等于 0 时会发生什么?

def summary(n_clicks):
    if n_clicks>0:
        names = ['Sum1', 'Sum2']
        return multi_dnwld(df1, df2, names)

你的if条件是False,所以它不会进入那个区块。您在此函数中没有其他代码,因此 Dash 使用 Python 默认 return 值 None。这可能只在应用程序加载时发生一次。只需添加一个 else 条件来处理这种情况就可以了。