首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Dash Store中使用Dash加载?

如何在Dash Store中使用Dash加载?
EN

Stack Overflow用户
提问于 2020-11-03 18:47:07
回答 1查看 592关注 0票数 1

我正在写一个简单的Dash页面。我从外部API等获取数据,并将其放入dcc.Store中。然后,图形在回调中提取数据并绘制。我正在尝试实现dcc.Loading功能,因为拉取数据可能需要一些时间。然而,当工作由Store完成时,我不知道如何触发图形的加载。

下面是一个示例:

代码语言:javascript
复制
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
import plotly.express as px
import pandas as pd
import time

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div(children=[
    html.H1(children='Hello Dash'),

    html.Div(children='''
        Dash: A web application framework for Python.
    '''),

    dcc.Dropdown(
        id='demo-dropdown',
        options=[
            {'label': 'New York City', 'value': 'NYC'},
            {'label': 'Montreal', 'value': 'MTL'},
            {'label': 'San Francisco', 'value': 'SF'}
        ],
        value='NYC'
    ),

    dcc.Loading(
        id='loading01',
        children=html.Div(id='loading-output')),
    # Store certain values
    dcc.Store(
        id='session',
        storage_type='session'),
])


@app.callback(Output('loading-output', 'children'),
              [Input('session', 'modified_timestamp')],
              [State('session', 'data')])
def loading_graph(ts, store):
    if store is None:
        raise PreventUpdate
    if 'NYC' in store['value']:
        v = 1
    elif 'SF' in store['value']:
        v=2
    else:
        v=3
    return dcc.Graph(
                 id='example-graph',
                 figure={
            'data': [
                {'x': [1, 2, 3], 'y': [4*v, 1*v, 2*v], 'type': 'bar', 'name': 'SF'},
                {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Montréal'},
            ],
            'layout': {
                'title': 'Dash Data Visualization'
            }
        }
             )

@app.callback(Output('session', 'data'),
              [Input('demo-dropdown', 'value')],
              [State('session', 'data')])
def storing(value, store):
    store = store or {}
    store['value'] = value
    time.sleep(3)
    return store


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

我想我是希望在Store取东西的时候旋转的人能在场。

提前感谢您的帮助或指点。

EN

回答 1

Stack Overflow用户

发布于 2021-07-16 20:41:33

如果您想在调用storing回调时显示一个加载器,它还需要有一个到Loading组件的children属性的输出。

您不能有重复的回调输出,因此您可以将这些回调合并为一个回调。然后,您可以使用单个微调器,只要执行组合回调所需的时间,该微调器就会一直处于活动状态。

或者您可以有多个Loading组件:每个回调函数对应一个:

代码语言:javascript
复制
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
from dash.exceptions import PreventUpdate
import time

external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"]

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div(
    children=[
        html.H1(children="Hello Dash"),
        html.Div(
            children="""
        Dash: A web application framework for Python.
    """
        ),
        dcc.Dropdown(
            id="demo-dropdown",
            options=[
                {"label": "New York City", "value": "NYC"},
                {"label": "Montreal", "value": "MTL"},
                {"label": "San Francisco", "value": "SF"},
            ],
            value="NYC",
        ),
        dcc.Loading(id="loading01", children=html.Div(id="loading-output1")),
        dcc.Loading(id="loading02", children=html.Div(id="loading-output2")),
        # Store certain values
        dcc.Store(id="session", storage_type="session"),
    ]
)


@app.callback(
    Output("loading-output2", "children"),
    Input("session", "modified_timestamp"),
    State("session", "data"),
    prevent_initial_call=True,
)
def loading_graph(ts, store):
    if store is None:
        raise PreventUpdate
    if "NYC" in store["value"]:
        v = 1
    elif "SF" in store["value"]:
        v = 2
    else:
        v = 3

    time.sleep(2)

    return dcc.Graph(
        id="example-graph",
        figure={
            "data": [
                {
                    "x": [1, 2, 3],
                    "y": [4 * v, 1 * v, 2 * v],
                    "type": "bar",
                    "name": "SF",
                },
                {"x": [1, 2, 3], "y": [2, 4, 5], "type": "bar", "name": u"Montréal"},
            ],
            "layout": {"title": "Dash Data Visualization"},
        },
    )


@app.callback(
    Output("session", "data"),
    Output("loading-output1", "children"),
    Input("demo-dropdown", "value"),
    State("session", "data"),
)
def storing(value, store):
    time.sleep(2)
    store = store or {}
    store["value"] = value
    return store, ""


if __name__ == "__main__":
    app.run_server(debug=True)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64661320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档