如何在没有输入的情况下使用破折号回调

Izu*_*ala 8 python plotly plotly-dash

我试图在没有 Input 的情况下调用 plotly-dash 回调,并且该方法不会触发。

这是我尝试使用破折号构建的仪表板。过去,当我对 Input 和 Output 使用回调时,一切正常,但是当我尝试仅使用 output 时,结果不会显示在仪表板上。

html.Div(
    [

        html.P(
            "Tweet Count",
            className="twelve columns indicator_text"
        ),
        html.P(
            id = 'tweet_value',
            className="indicator_value"
        ),
    ],
    className="four columns indicator",

)

@app.callback(
Output("tweet_value","children")

)
def total_tweet_callback():

    return 100   
Run Code Online (Sandbox Code Playgroud)

小智 12

所有回调在加载时都会运行一次,除非明确禁用。因此,一个简单的解决方案是使用虚拟输入,引用任何内容,但不使用它。

我不同意另一个答案。直接调用该函数不会使其触发每个“加载”。这样,该函数仅在语句运行时运行一次。该功能仅在应用程序启动时触发,而不是每次单击浏览器刷新按钮时触发。如果您在那里使用datetime.datetime.now(),您可以看到差异。

  • 只要您使用函数进行布局(例如在我的答案中使用 lambda 函数),刷新页面时就会调用该函数。 (2认同)

Sho*_*alt 9

至少需要一个输入或事件才能调用回调,如dash.py代码中所写:

没有InputorEvent元素,这个回调永远不会被调用。

(订阅输入组件将在它们的值发生变化时调用回调,订阅事件将导致在触发事件时调用回调。)

在您的情况下 - 如果没有回调触发器,为什么要使用回调?如果您只想total_tweet_callback在加载时运行一次,只需从布局中调用它:

def total_tweet_callback():
    return 100

app.layout = lambda: html.Div(
    [
        html.P(
            "Tweet Count",
            className="twelve columns indicator_text"
        ),
        html.P(
            children=total_tweet_callback(),
            id='tweet_value',
            className="indicator_value"
        ),
    ],
    className="four columns indicator",
)
Run Code Online (Sandbox Code Playgroud)

请注意:

  1. 我从total_tweet_callback.
  2. 我给了布局一个返回 Div 元素的函数。这不一定是必需的,并且取决于您的代码的其他方面,我不会在这里介绍,但是您可以尝试删除它lambda:并查看它是否仍然有效。


Has*_*tax 6

您可以使用dcc.Interval.

刷新页面时有效。

from datetime import datetime

# within layout
dcc.Interval(
    id="load_interval", 
    n_intervals=0, 
    max_intervals=0, #<-- only run once
    interval=1
),
html.Span(
    id="spanner",
    style=dict(color="yellow") #<-- just so it's easy to see
),

# callback
@app.callback(
    Output(component_id="spanner", component_property="children"),
    Input(component_id="load_interval", component_property="n_intervals"),
)
def update_spanner(n_intervals:int):
    return datetime.now()
Run Code Online (Sandbox Code Playgroud)

无论如何,我需要定期刷新初始数据,因此熟悉一下是有好处的Intervaln_intervals有点像n_clicks

https://dash.plotly.com/dash-core-components/interval


免责声明;我上面的方法是一种黑客,我不知道它是否会长期有效。