我有一个使用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是如何在引擎盖下工作的。