与dash应用程序集成后如何刷新python folium(map.html文件)?

Posted

技术标签:

【中文标题】与dash应用程序集成后如何刷新python folium(map.html文件)?【英文标题】:How to refresh python folium (map.html file) after integrating it with dash app? 【发布时间】:2020-03-27 21:49:24 【问题描述】:

我是 python 编程和 Dash 的新手,所以如果我说错了,请原谅我。 我正在使用 folium 库和 Dash。我找到了这个example on ***,我已经将folium map 转换为一个html 文档,并将那个html 文档传递给Dash(使用iframe 组件),并将它显示在我的应用程序中。

这是我使用 Dash 显示我的应用的代码:

app = dash.Dash()

app.layout = html.Div([
    html.H1('My first app with folium map'),
    html.Iframe(id='map', srcDoc=open('example_map.html', 'r').read(), width='100%', height='600'),
    html.Button(id='map-submit-button', n_clicks=0, children='Submit')
])


@app.callback(
    dash.dependencies.Output('map', 'srcDoc'),
    [dash.dependencies.Input('map-submit-button', 'n_clicks')])
def update_map(n_clicks):
    if n_clicks is None:
        return dash.no_update
    else:
        return html.Div([
            html.H1('My first app with folium map'),
            html.Iframe(id='map', srcDoc=open('example_map.html', 'r').read(), width='100%', height='600'),
            html.Button(id='map-submit-button', n_clicks=0, children='Submit')
        ])


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

现在我正在尝试使用 app.callback 刷新 folium 地图(我已传递给 Dash 的 html 文档),以防 html 文档中的坐标取自 json API(每 30 秒刷新一次) ),但它似乎不起作用。 这接近正确的方法吗?如果没有,我该怎么办?提前谢谢你!

【问题讨论】:

【参考方案1】:

我有同样的问题,所以我只是尝试了解决方案。我认为 IF 语句需要更改为 'if n_clicks == 0' 而不是 'n_clicks is None'。如果是后者,地图会在您按下按钮之前自动更新。

@app.callback(
    dash.dependencies.Output('map', 'srcDoc'),
    [dash.dependencies.Input('map-submit-button', 'n_clicks')])
def update_map(n_clicks):
    if n_clicks == 0:
        return dash.no_update
    else:
        return open('example_map.html', 'r').read()

如果我遗漏了什么,请告诉我 :) 我对 Dash 还是很陌生。

【讨论】:

【参考方案2】:

问题是您将整个 html.Div 组件返回到 iFrame 的 src 属性,这超出了您的预期。你的回调应该是:

@app.callback(
    dash.dependencies.Output('map', 'srcDoc'),
    [dash.dependencies.Input('map-submit-button', 'n_clicks')])
def update_map(n_clicks):
    if n_clicks is None:
        return dash.no_update
    else:
        return open('example_map.html', 'r').read()

这将在每次单击按钮时返回地图的 HTML 字符串。 HTML 字符串将替换应用程序的“地图”组件的“srcDoc”属性。我没有对此进行测试,所以如果它仍然无法正常工作,请告诉我。

希望这会有所帮助!

【讨论】:

以上是关于与dash应用程序集成后如何刷新python folium(map.html文件)?的主要内容,如果未能解决你的问题,请参考以下文章

python: dash 实况情节图例

用户在 GSuite Marketplace 中安装我的云端硬盘应用后,如何获取用户凭据(刷新令牌)?

《Python开发 - Python库》Dash安装与使用 (构建Web应用的 Python 库)

《Python开发 - Python库》Dash安装与使用 (构建Web应用的 Python 库)

如何在 Dash Web 应用程序中使用“dash.properties.Synced”? | Python

将 Dash 应用程序集成到 Flask:最小示例