通过回调更新 Dash 数据表

Posted

技术标签:

【中文标题】通过回调更新 Dash 数据表【英文标题】:Updating Dash Datatable through callback 【发布时间】:2020-03-18 23:59:04 【问题描述】:

我想根据时间间隔更新我的 Dash 数据表。它会运行,但没有任何更新。我不认为这应该很难,但我显然错过了一些东西。这是我所拥有的:

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import time
import pandas as pd

数据组件

def getData():
"""
Only can hit api every 6 seconds for 14 total items, 
which is relevant towards the Dash interval  
    """
        df = pd.DataFrame()
        for item in list:
            data  = *hit api*
            df = df.append(data)
            time.sleep(7)
        return df

破折号组件

app = dash.Dash(__name__)

# passing in just column names to avoid needlessly hitting API 
tblcols=['name': 'col1', 'id': 'col1',
     'name': 'col2', 'id': 'col2', 
     'name': 'col3', 'id': 'col3'      
     ]

app.layout = html.Div([
      html.H4('Dashboard Name'),
      dcc.Interval('graph-update',interval = 500000, n_intervals = 0),
      dash_table.DataTable(
              id = 'table',
          data = [],
          columns=tblcols )])

@app.callback(
        Output('table','data'),
        [Input('graph-update', 'n_intervals')]
        )
def updateTable(n):

     """
     calling the get data function
     """

     updated_data = getData()
     return updated_data.to_dict('records')

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

再次,这将运行并返回我传递的列标题,但是当我看到更新已在控制台“POST /_dash-update-component HTTP/1.1”中运行时,没有任何变化

【问题讨论】:

您有for item in list:,但我看不到list 的定义位置。通常也不建议使用这样的受保护名称。您的循环将 sleep 持续 7 秒,然后重新开始。你要等多久?您的循环将运行与list 中的值一样多的次数,因此它可能会在返回值之前运行几分钟。 【参考方案1】:

我认为问题在于您返回一个空的dataframe。这是因为您使用df.append(data) 而不是df = df.append(data)

这是一个简化且有效的代码(Dash v1.6.0):

import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import pandas as pd
import numpy as np

app = dash.Dash(__name__)

def getData():
    df = pd.DataFrame()
    for idx in range(10):
        data  = 'x': np.random.random(1)[0], 'y': np.random.random(1)[0]
        df = df.append(data, ignore_index=True)
    return df.to_dict('records')

tblcols=['name': 'x', 'id': 'x',
         'name': 'y', 'id': 'y', ]

app.layout = html.Div([
      html.H4('Dashboard'),
      dcc.Interval('graph-update', interval = 1000, n_intervals = 0),
      dash_table.DataTable(
          id = 'table',
          data = getData(),
          columns=tblcols)])

@app.callback(
        dash.dependencies.Output('table','data'),
        [dash.dependencies.Input('graph-update', 'n_intervals')])
def updateTable(n):
     return getData()

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

【讨论】:

感谢您的回复。我在问题代码中遗漏了 df = df.append(data) 但它存在于我的实际代码中。问题最终是我需要对 Output('table','columns') 进行回调,并且间隔足够大以适应 getData() 函数所需的时间。

以上是关于通过回调更新 Dash 数据表的主要内容,如果未能解决你的问题,请参考以下文章

Plotly Dash dcc.Interval 在一段时间后失败:回调错误更新 graph.figure

Plotly Dash 表回调

Dash Plotly中的烛台图和折线图,它会随着回调而更新,但会消失

Dash:如何更新回调中的数百个元素?

通过更新其他组件来更改 Dash 组件的可见性

回调错误更新 plot-div.children (Plotly Dash)