Python 我们如何使用回调函数和提供数据帧的函数在仪表板表格中动态创建数据列
我正在尝试使用输入在Web上创建仪表板表格。但是问题是,数据是通过回调和先验从数据库创建的, 除非使用回调函数创建DataFramework,否则我不知道列的名称。 我已经检查了我是否得到了正确的数据。但是,我们无法显示它。我使用了多个输出选项(使用破折号0.41) 我的代码如下所示:(我没有提供在回调someFunc中生成熊猫数据帧的函数的详细信息, 因为这对于本破折号代码的故障排除并不重要Python 我们如何使用回调函数和提供数据帧的函数在仪表板表格中动态创建数据列,python,html,css,pandas,plotly-dash,Python,Html,Css,Pandas,Plotly Dash,我正在尝试使用输入在Web上创建仪表板表格。但是问题是,数据是通过回调和先验从数据库创建的, 除非使用回调函数创建DataFramework,否则我不知道列的名称。 我已经检查了我是否得到了正确的数据。但是,我们无法显示它。我使用了多个输出选项(使用破折号0.41) 我的代码如下所示:(我没有提供在回调someFunc中生成熊猫数据帧的函数的详细信息, 因为这对于本破折号代码的故障排除并不重要 import dash_table as dt def someFunc(ID, pattern
import dash_table as dt
def someFunc(ID, pattern_desc, file_path):
## do something
return df # pandas dataframe
#
因此,在本例中,接受3个输入参数的函数someFunc返回一个数据帧,该数据帧可以根据输入具有不同的列。因此,应用程序布局应该显示
回调函数的输出根据输入动态给出的列。
我应该用表格和列填充网页,但得到的是一个错误。当我运行此操作时,我将通过函数生成的数据获取到文件中,但dash无法
已在网页上生成表。我收到以下错误:
dash.exceptions.InvalidCallbackReturnValue:回调..table.data..table.columns..是一个多输出。
输出类型应为列表或元组,但得到了Div([DataTable(columns=[{'name':'pattern\u desc','id':'pattern\u desc'},…。
不知道我如何才能做到这一点。任何帮助都将不胜感激。如果我理解正确,那么您只需创建另一个回调,输出
列
道具的更新值。您也可以使用多输出回调同时更新这两个列
@app.callback(输出('table','columns'),
[输入('submit','n_clicks')],
[状态('ID','value'),状态('pattern_desc','value'),
状态(“文件路径”、“值”)])
def更新表格(n_点击、ID、模式描述、文件路径):
mydata=someFunc(ID、模式描述、文件路径)
#在这里,您将使用dataframe列来创建新的列值
返回新的\u列\u值
在仪表板回调中,您应该向两个单独的输出返回两个单独的值:
[输出('table','data'),输出('table','columns')]
您将返回:
return html.Div([
dt.DataTable(
id='table',
columns=mycolumns,
data=df.to_dict("rows")
)
])
只有1个输出
Dash希望列表或元组中有2个返回值,如下所示:
return("output1" , outputVariable2)
或
为了解决此问题,可以在元组或列表中返回2个值,或者编辑输出要求,以便只需要一个值
从外观上看,您试图返回一个包含Datatable的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")
)
])
谢谢coral。我使用了类似的东西,但仍然不起作用。我需要在定义表的布局中放置任何东西吗:def update_table(n_clicks,ID,pattern_desc,file_path):mydata=someFunc(ID,pattern_desc,file_path)mydata2=mydata.to_dict(“rows”)mycols=[{'name':I,'ID':I}代表mydata.columns中的I]return mycols,mydata2新回调函数在装饰器中的输出列表后没有逗号。运行应用程序时是否有错误?这是一个输入错误,不在实际代码中。当我运行程序时,我以当前形式得到错误。好的,是的。我看到您将输出包装在
div
中,但您应该有它如下所示:返回df.to_dict(“行”),mycolumns
谢谢Miked。我将尝试代码并向您发布。Mked,我尝试了两个版本,保持代码完整并返回元组,以及作为修改后的代码粘贴为TableDiv,children。没有任何效果。唯一的问题是,这次我没有收到任何错误,并且还生成了输出文件(在调用somefunc函数时创建)但是,在提交按钮的敲击下,页面停止了,没有显示表。这意味着您所询问的错误是固定的。您的代码中的其他地方必须存在其他问题。您应该考虑将此问题标记为固定的并提出不同的问题。谢谢,我已经能够修复它。谢谢您的帮助。
return[ Html.Div("text") , "output Text 2"]
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")
)
])