本文介绍了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条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!