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
相关产品推荐
相关产品推荐

