DASH/PULTLY中的回调忽略IF条件 [英] callback in dash/plotly ignores if condition

查看:20
本文介绍了DASH/PULTLY中的回调忽略IF条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了DASH/PLATTY的问题。我有一个带有输入框、按钮和图形区域的html页面。一旦按下按钮,我就使用回调来更新图形(基于输入框条目)。然而,当我第一次加载我的页面时,尽管输入框是空的,但它似乎在故意强制计算回调函数。因此,我在更新时出现回调错误...

以下是我的代码:

layout = html.Div([
    dbc.Container([
        dbc.Row([
            dbc.Col(html.H1("1Y Stock Plot", className="text-center")
                    , className="mb-5 mt-5")
        ]),
       html.Div([
            dcc.Input(id='stockplot_symbol', placeholder='enter a stock ticker'),
            html.Button("Plot", id='submit_stockplot', n_clicks=0),
        ]),
        html.Div(id='output-graph')
    ])
])

和回调:

@app.callback(Output('output-graph', 'children'), #'stock_plot_graph', 'figure'),
              [Input('submit_stockplot', 'n_clicks')],
              [State('stockplot_symbol', 'value')]
              )
def update_stockplot(n_clicks, symbol):
    if n_clicks is not None:
        ticker = str(symbol).upper()

        df = yf.Ticker(ticker).history(period='1y', interval='1d')

        fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.1, row_heights=[0.7, 0.2])
        op = df['Open'].astype(float)
        hi = df['High'].astype(float)
        lo = df['Low'].astype(float)
        cl = df['Close'].astype(float)
        vo = df['Volume'].astype(float)

        upper, middle, lower = talib.BBANDS(cl, timeperiod=10, nbdevup=2, nbdevdn=2)

        fig.add_trace(go.Candlestick(x=df.index,
                                 open=op,
                                 high=hi,
                                 low=lo,
                                 close=cl, name=symbol), row=1, col=1)

        fig.add_trace(go.Scatter(x=df.index, y=upper, name='Upper Band'), row=1, col=1)
        fig.add_trace(go.Scatter(x=df.index, y=middle, name='Middle Band'), row=1, col=1)
        fig.add_trace(go.Scatter(x=df.index, y=lower, name='Lower Band'), row=1, col=1)
        fig.add_trace(go.Bar(x=df.index, y=vo, name='volume'), row=2, col=1)
        fig.update_layout(xaxis_rangeslider_visible=False,
                      height=800,
                      xaxis=dict(type="date"),
                      hovermode='x unified'
                      )
        return dcc.Graph(id='stock_plot_graph', figure=fig)
    else:
        return dash.exceptions.PreventUpdate
我确实在布局中将n_clicks设置为0,但不知何故,dash/ploly强制计算if/Else语句中的内容,由于输入框中没有任何内容,因此dataframe为空,因此在我调用talib.BANDS(这是dash/ploly报告更新回调错误的函数)时会产生问题...Df为空)

我的想法是只有在单击按钮时才更新或绘制图形区域。这在第一次调用后工作得很好,但在第一次加载页面时就不行了。我尝试使用If语句来测试输入框是否为空,但得到了相同的Callabck错误。我可以设置一个初始/缺省值来避免这种情况,但对于我想要做的事情来说,这并不是最优的。我不想让回调中的函数在伪输入上求值,因为稍后该函数的处理时间将不会像上面的情况那样快。

如何避免这种情况?

推荐答案

我的想法是只有在单击按钮时才更新或绘制图形区域。这在第一次调用后运行良好,但在第一次加载页面时不起作用。

如果希望避免在页面加载时执行回调,可以将回调的prevent_initial_call属性设置为True

Dash应用程序中的所有回调都是在首次加载应用程序时使用其输入的初始值执行的。这称为回调的初始调用...当回调的输入最初出现在Dash应用程序的布局中时,您可以使用Prepect_Initial_Call属性来防止触发回调。此属性适用于最初加载Dash应用的布局时,以及在触发回调时将新组件引入布局时。

https://dash.plotly.com/advanced-callbacks#prevent-callbacks-from-being-executed-on-initial-load

这篇关于DASH/PULTLY中的回调忽略IF条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆