我正在尝试使用输入在Web上创建破折号表。但是问题是数据是从回调和先验的数据库中创建的,我不知道列的名称,除非使用回调函数创建了pandas dataframe。我已经检查过我得到了正确的数据。但是无法显示它。我使用了多个输出选项(使用Dash 0.41)
我的代码如下所示:(我没有提供在回调someFunc中生成pandas数据帧的函数的详细信息,因为这对于此Dash代码TroubleShooting而言并不重要。
import dash_table as dt
def someFunc(ID, pattern_desc, file_path):
## do something
return df # pandas dataframe
#
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
server = app.server
app = dash.Dash(__name__)
app.config.suppress_callback_exceptions = True
app.css.config.serve_locally = True
app.scripts.config.serve_locally = True
app.layout = html.Div(
children = [
html.Div(
id = 'title',
children = appTitle,
className = 'titleDiv'
),
html.Div(
children = [
html.Div(
children = "Enter ID:",
className = 'textDiv'
),
dcc.Input(
id = 'ID',
type = 'text',
value = 'ABCER1',
size = 8),
html.Div(
children = "Enter Test Pattern",
className = 'textDiv'
),
dcc.Input(
id = 'pattern_desc',
type = 'text',
value = 'Sample',
size = 20),
html.Div(
children = "Enter File OutPut Path:",
className = 'textDiv'
),
dcc.Input(
id = 'file_path',
type = 'text',
value = '',
size = 30),
html.Button(
id = 'submit',
n_clicks = 0,
children = 'Search'
)
]
),
html.Div(
id = 'tableDiv',
children = dash_table.DataTable(
id = 'table',
style_table={'overflowX': 'scroll'},
style_as_list_view=True,
style_header={'backgroundColor': 'white','fontWeight':
'bold'},
),
className = 'tableDiv'
)
]
)
# callback to update the table
@app.callback([Output('table', 'data'),Output('table', 'columns')]
[Input('submit', 'n_clicks')],
[State('ID', 'value'), State('pattern_desc', 'value'),
State('file_path', 'value')])
def update_table(n_clicks, ID, pattern_desc, file_path):
df = someFunc(ID, pattern_desc, file_path)
mycolumns = [{'name': i, 'id': i} for i in df.columns]
return html.Div([
dt.DataTable(
id='table',
columns=mycolumns,
data=df.to_dict("rows")
)
])
因此在这种情况下,带有3个输入参数的函数someFunc返回一个pandas数据帧,该数据帧可以根据输入具有不同的列。因此,应用程序布局应根据输入动态显示回调函数输出所给出的那些列。我应该得到填充表和列的网页,但反而得到一个错误。当我运行它时,我将通过函数生成的数据获取到文件,但破折号无法在网页上生成表格。我收到以下错误:
dash.exceptions.InvalidCallbackReturnValue:回调..table.data ... table.columns ..是一个多输出。期望输出类型为列表或元组但得到Div([DataTable(columns = [{'name':'pattern_desc','id':'pattern_desc'},......
不确定我怎么能做到这一点。任何帮助将不胜感激。
如果我理解正确,那么你可以简单地创建另一个回调,输出columns
道具的更新值。您还可以使用多输出回调来同时更新这两个回调。
@app.callback(Output('table', 'columns'),
[Input('submit', 'n_clicks')],
[State('ID', 'value'), State('pattern_desc', 'value'),
State('file_path', 'value')])
def update_table(n_clicks, ID, pattern_desc, file_path):
mydata = someFunc(ID, pattern_desc, file_path)
# here you would use the dataframe columns to create the new column values
return new_column_values
在您的Dash回调中,您应该将2个单独的值返回到2个单独的输出:[Output('table', 'data'),Output('table', 'columns')]
你回来了:
return html.Div([
dt.DataTable(
id='table',
columns=mycolumns,
data=df.to_dict("rows")
)
])
这只是1输出。
Dash在列表或类似的元组中需要2个返回值:
return("output1" , outputVariable2)
要么
return[ Html.Div("text") , "output Text 2"]
为了解决问题,要么在元组或列表中返回2个值,要么编辑输出要求,因此只需要一个值。
从它的外观来看,你试图返回一个包含数据表的Div,所以你可以进行以下更改:
html.Div(
id = 'tableDiv',
className = 'tableDiv'
)
...
@app.callback([Output('tableDiv', 'children')]
[Input('submit', 'n_clicks')],
[State('ID', 'value'), State('pattern_desc', 'value'),
State('file_path', 'value')])
def update_table(n_clicks, ID, pattern_desc, file_path):
df = someFunc(ID, pattern_desc, file_path)
mycolumns = [{'name': i, 'id': i} for i in df.columns]
return html.Div([
dt.DataTable(
id='table',
columns=mycolumns,
data=df.to_dict("rows")
)
])