You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Plotly Dash回调报错:TypeError: string indices must be integers 求助

搞定TypeError: string indices must be integers这个坑

嘿,我一眼就瞅到问题根源了:你用json.dumps()把原本是字典的clickData转成了字符串,结果还想用字典的索引方式去访问它,这不就报错了嘛——字符串只能用整数下标取单个字符,根本不认['points']这种键名啊!

问题出在这行代码

看你这段回调里的关键错误:

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

json.dumps()是把Python字典转成JSON格式的字符串,所以res现在是一串文本,不是你需要的字典结构了,后面再写res['points']肯定要炸。

直接用原始字典就行,别多此一举

把那行序列化的代码删掉,直接操作传入的clickData字典就好,还得加个非空判断(不然用户没点击地图时clickData是None,也会报错):

@app.callback([Output("modal","is_open"), Output("name","children"), Output("address","children")], 
              [Input("map-graph1","clickData")] )
def display_popup(clickData):
    # 先处理没点击的情况
    if not clickData:
        return False, "", ""
    
    # 直接从clickData字典里取值
    tenant_info = clickData['points'][0]['customdata']
    tenant_name = tenant_info['Tenant']
    tenant_address = tenant_info['Address']
    
    print(tenant_name, tenant_address)
    return True, tenant_name, tenant_address

你试的遍历写法也改改

如果要处理多个点的情况,同样得基于原始字典,不能用序列化后的字符串:

def display_popup(clickData):
    if not clickData:
        return False, "", ""
    
    name = ""
    address = ""
    # 遍历clickData里的points列表,不是res的!
    for point in clickData['points']:
        custom_data = point.get('customdata')
        if custom_data:
            name = custom_data.get('Tenant', "")
            address = custom_data.get('Address', "")
    
    print(name, address)
    return True, name, address

最后提个小提醒

在Dash的回调里,用户还没点击地图的时候,clickData的值是None,所以一定要先做非空判断,不然会触发KeyError或者TypeError,上面的代码都加了这个逻辑,放心用~

内容的提问来源于stack exchange,提问作者kms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:17:45