首页 > 解决方案 > Plotly Dash:TypeError:字符串索引必须是整数

问题描述

回调函数display_popup遍历来自customdata参数的json 字符串传递mapbox graph并读取值。当我在 jupyter notebook 中运行没有该函数的代码时,它不会引发错误。

@app.callback([Output("modal","is_open"),
           Output("name","children"),
           Output("address","children")],
          [Input("map-graph1","clickData")]
         )
def display_popup(clickData):

    res = json.dumps(clickData, indent=2)

    Tenant = res['points'][0]['customdata']['Tenant']
       
    Address = res['points'][0]['customdata']['Address']
        
    print(Tenant, Address)

clickData = {
             "points": [
              {
               "curveNumber": 64,
               "pointNumber": 0,
               "pointIndex": 0,
               "lon": -112.07451978751655,
               "lat": 33.459071231389125,
               "customdata": {
                              "Tenant": "HeartFlow",
                              "Industry": "Advertising",
                              "Space": 65195,
                              "Property": "Retail",
                              "Bldg. class": "A",
                              "Lease Type": "Flex",
                              "Rent": 36.28,
                              "Address": "100 W Roosevelt St, Phoenix, AZ 85003, USA"
                             }
                }
          ]
        }

或者,我也尝试过带有键值对的字典。

for x in res['points']:

    cd = x.get('customdata')

    name = cd.get('Tenant')
    address = cd.get('Address')

仍然抛出一个TypeError: string indices must be integers

标签: pythondictionaryplotly-dash

解决方案


这是修复它的代码:

# Update modal on click event
@app.callback([Output("modal","is_open"),
               Output("Name","children"),
               Output("Address","children")],

              [Input("map-graph1","clickData"),
               Input("close","n_clicks")],

              [State("modal", "is_open")],
)
def display_popup(clickData, close, is_open):

    if clickData is None:

        return [no_update] * 3

    else:

        #res = json.dumps(clickData, indent=2)

        Tenant = clickData['points'][0]['customdata']['Tenant']
        Address = clickData['points'][0]['customdata']['Address']
        

        return(not is_open, Tenant, Address)

    if close:

        return is_open

推荐阅读