【问题标题】:How to change image on image click in Plotly?如何在 Plotly 中单击图像时更改图像?
【发布时间】:2021-04-15 20:49:15
【问题描述】:

在我的应用中,我需要在点击图片时更改图片。我该怎么做?

文件夹结构:

- app.py
- assets/
    |-- custom-script.js

app.py

app = dash.Dash(__name__)
app.layout = html.Div(
[
html.Img(
            className="myImg",
            id="speak_btn",
            src="assets/img/microphone.png",


              style={},
            ),

])

自定义脚本.js

$(document).ready(function () {
    $(".myImg").click(function () {
        if ($(this).attr("src") === "assets/img/microphone.png")
            $(this).attr("src", "assets/img/voice_gif.gif");
        else if ($(this).attr("src") === "assets/img/voice_gif.gif")
            $(this).attr("src", "assets/img/microphone.png");
    })
});

这里是理解我为什么将它放在资产文件夹中的指南 https://dash.plotly.com/external-resources

custom-script.js 已经过测试并且可以正常工作。需要帮助使其适应破折号。谢谢

【问题讨论】:

    标签: javascript python plotly plotly-dash


    【解决方案1】:

    您可以使用app.clientside_callback() 像这样运行 JS 客户端:

    import dash
    from dash.dependencies import Input, Output, State
    import dash_html_components as html
    
    app = dash.Dash(__name__)
    
    app.layout = html.Div([
    
        html.Img(id='speak_btn', src='assets/img/microphone.png', className='myImg', n_clicks_timestamp=0)
    
    ])
    
    app.clientside_callback(
        """
        function(click, src) {
            if ( src == 'assets/img/microphone.png' && click != 0 ) {
                return 'assets/img/voice_gif.gif';
            } else {
                return 'assets/img/microphone.png';
            }
        }
        """,
        Output('speak_btn', 'src'),
        [Input('speak_btn', 'n_clicks_timestamp')],
        [State('speak_btn', 'src')]
    )
    
    if __name__ == '__main__':
        app.run_server()
    

    您也可以在不使用 JS 的情况下完成此任务,方法是编写回调以在每次更新 html.Img 时更改 html.Imgsrc 属性,如下所示:

    import dash
    from dash.dependencies import Input, Output, State
    import dash_html_components as html
    from dash.exceptions import PreventUpdate
    
    app = dash.Dash(__name__)
    
    microphone = 'assets/img/microphone.png'
    voice_gif = 'assets/img/voice_gif.gif'
    
    app.layout = html.Div([
    
        html.Img(id='speak_btn', src=microphone, className='myImg', n_clicks_timestamp=0)
    
    ])
    
    @app.callback(
        Output('speak_btn', 'src'),
        [Input('speak-btn', 'n_clicks_timestamp')],
        [State('speak_btn', 'src')])
    def change_img(click, src):
    
        if not click: raise PreventUpdate
    
        return gif if src==microphone else microphone
    
    if __name__ == '__main__':
        app.run_server()
    

    【讨论】:

    • 谢谢。这是一个很好的方法。然而,这不是我使用 JS 的唯一目的。如果我要严格使用自定义 JS 来做,我会怎么做?
    • 我已经包含了一个运行客户端 JS 的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2014-05-17
    相关资源
    最近更新 更多