python - 我们如何使用回调和提供数据框的函数动态地在 Dash Table 中创建数据列

标签 python html css pandas plotly-dash

我正在尝试使用输入在 Web 上创建破折号表。然而,问题是数据是从回调和先验的数据库中创建的, 除非使用回调函数创建 pandas 数据框,否则我不知道列的名称。 我已检查我是否获得了正确的数据。但是无法显示它。我使用了多个输出选项(使用 Dash 0.41)

我的代码如下所示:(我没有在回调 someFunc 中提供生成 pandas 数据帧的函数的详细信息, 因为这对于此 Dash 代码故障排除的目的并不重要。

 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'}, ......

不确定如何实现。任何帮助将不胜感激。

最佳答案

在您的 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")
         )
        ])

关于python - 我们如何使用回调和提供数据框的函数动态地在 Dash Table 中创建数据列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55801796/

相关文章:

python - 包含同名类的 Python 模块在导入时如何工作?

python - 多索引和时区 - 卡住列表错误

javascript - 滚动时粘性部分,但被下面的部分覆盖

javascript - 如何创建像指标一样的循环进度(饼图)

python:在存在字符串的情况下将pandas数据框中的数值数据转换为 float

javascript - 如何知道访问者拒绝与网站共享其位置?

python - 从 beautifulsoup 元素中提取原始字符串位置

css - 如何防止IE和FF中位图字体抗锯齿

css - 如何使 RSS 链接加粗?

python - Python 中的元编程 - 添加对象方法