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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:24:05