当我使用常规Dashcallback
时,我的应用程序运行良好,但我目前被迫使用long_callback
。在这种情况下,我的微调器(dcc.Loading
(几乎立即消失——尽管具有讽刺意味的是,这似乎是一个非常有用的微调器位置。我尝试在下面创建一个最小的示例。
我是滥用了微调器,还是这是一个bug?
import dash
from dash import dcc
from dash import html
from dash.dependencies import Input, Output
from dash.long_callback import DiskcacheLongCallbackManager
import diskcache
import time
cache = diskcache.Cache('./cache')
long_callback_manager = DiskcacheLongCallbackManager(cache)
app = dash.Dash(
__name__,
long_callback_manager=long_callback_manager,
)
app.layout = html.Div(children=[
dcc.Slider(id='my_slider', min=1, max=10, step=1, value=5),
dcc.Loading(
html.Div(id='my_div', children=['Start']),
),
])
@app.long_callback(
Output('my_div', 'children'),
Input('my_slider', 'value'),
interval=2000,
)
def update_div(slider_value):
time.sleep(5)
return f'Done loading: {slider_value}'
if __name__ == '__main__':
app.run_server(debug=True)
我尝试在long_callback
的running
参数中设置loading_state
/is_loading
属性,但没有成功。也许这不是一个";"可设置";所有物
不确定这是否是您正在寻找的解决方案,但我发现了一种使用dbc的dash引导组件的方法。Spinner与long_callback的running关键字参数结合使用。
首先,在要显示微调器的地方创建一个div,给它一个唯一的id名称,并将其子项设置为None。对我来说,我使用了dbc.Row(dbc.Col())
而不是div,但它的工作原理应该是一样的。然后,您需要设置long_callback的running关键字参数,以输出dbc。Spinner。下面的代码目前正在为我工作。我已经删除了很多代码,所以忽略输入、输出和缺少布局组件。请注意运行kwarg。
app.layout = dbc.Container(dbc.Row(dbc.Col(id='fs_spinner', children=None)))
@app.long_callback(
output=(
Output("full_search_predictions", "data"),
Output("full_results_query", "data"),
),
inputs=[
Input("submit_button", "n_clicks"),
Input("search_query", "value"),
],
running=[
(Output('fs_spinner', 'children'), dbc.Spinner(size='md'), None)
],
interval=20000,
prevent_initial_call=True,
)
以下是正在发生的事情。当long_callback开始时,它返回一个dbc。Spinner((到fs_Spinner的子组件。回调完成后,它会向fs_spinner的子组件返回None,从而从屏幕中删除微调器。
希望这能有所帮助!