本文介绍了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

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

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

10-20 10:57