为什么ListCtrl的SetItemData无法传字符串,CustomTreeControl却可以?
ListCtrl调用SetItemData传入字符串触发类型错误解决方案
报错原因
该报错是wx.ListCtrl的原生设计限制导致的:
- 原生
ListCtrl.SetItemData()方法仅支持传入整数类型参数,底层设计仅用于存储行关联的ID、索引等整数值,传入字符串会触发类型校验失败,对应报错信息如下:
TypeError: ListCtrl.SetItemData(): argument 2 has unexpected type 'str'
- 你用到的
CustomTreeControl属于二次封装的自定义控件,内部重载了SetItemData方法适配了任意Python对象的存储,所以相同用法可以正常运行。
解决方案
可以根据使用场景选择两种方案:
方案1:字典映射存储(兼容所有wxPython版本)
单独维护行索引和对应字符串的映射关系,改动量最小:
# 控件初始化时新增映射字典 self.row_data_mapping = {} # 写入数据逻辑 list_row = self.lc_results.GetItemCount() data_str = item.split(':')[1] # 字符串存入字典 self.row_data_mapping[list_row] = data_str # SetItemData传入行索引作为关联标识 self.lc_results.SetItemData(list_row, list_row) # 读取数据逻辑 selected_row = 0 # 替换为实际获取的选中行索引 row_key = self.lc_results.GetItemData(selected_row) target_str = self.row_data_mapping[row_key]
方案2:使用SetItemDataPtr(wxPython 4.0+版本支持)
高版本wxPython提供了支持任意Python对象存储的接口,直接替换方法即可:
# 写入数据 list_row = self.lc_results.GetItemCount() self.lc_results.SetItemDataPtr(list_row, item.split(':')[1]) # 读取数据 target_str = self.lc_results.GetItemDataPtr(selected_row)
内容的提问来源于stack exchange,提问作者cmccall95
相关产品推荐
相关产品推荐

