dash组件Interval属性n_intervals值在回调中显示不同



我有一个使用dcc的短代码。Interval组件更新回调中的文本,我试图在其中打印出n_intervals属性的值。

from dash import Dash, html, dcc, Input, Output
app = Dash()
dccinterval = dcc.Interval(
id='interval-component',
interval=1000,
n_intervals=0
)
app.layout = html.Div(
children=[
html.Div(id='live-update-text'),
dccinterval
]
)

@app.callback(Output('live-update-text', 'children'),
Input(dccinterval, 'n_intervals'))
def update_message(n):
print('current interval in update_message: ', dccinterval.n_intervals)
print('current n in update_message: ', n)
return 'Message: ' + str(n)

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

这是输出:

current interval in update_message:  0
current n in update_message:  0
current interval in update_message:  0
current n in update_message:  1
current interval in update_message:  0
current n in update_message:  2
current interval in update_message:  0
current n in update_message:  3
.
.
.

正如您可能看到的,通过Input获得的n_intervals的值正在正确更改,但直接从interval组件获得的值始终保持在0。我想知道为什么。有人能帮我做这个吗?我需要弄清楚这一点的原因是,在我的应用程序中,当我试图通过组件更改n_intervals的值时失败了。也就是说,当我尝试通过执行dccinterval.n_intervals = a number来设置值时,它不起作用。

非常感谢您的评论!

dccinterval.n_intervals出现得很奇怪,因为这不是使用间隔组件的正确方式。另一种方法是使用n,这是表示与Input间隔的函数自变量,这是正确的方法。但是,您对Input的定义有点错误。您不需要引用组件的变量dccinterval,而需要引用该组件的id,如下所示:

Input('interval-component', 'n_intervals')

如果您想更新间隔的值,您需要设置一个回调,将其用作Output,如下所示:

Output('interval-component', 'n_intervals')

函数将return,无论您想将间隔更新为哪个值。

编辑:因此,错误的方法不起作用的原因是,一旦应用程序运行,您在布局中声明的变量dccinterval就不包含所有细节。回调函数的参数n在本例中具有正确的信息,因为它已通过Dash更新。这与Dash的工作方式有关,更深入地说,React是如何在引擎盖下工作的。

最新更新