wxPython ListCtrl 列忽略特定字段

Posted

技术标签:

【中文标题】wxPython ListCtrl 列忽略特定字段【英文标题】:wxPython ListCtrl Column Ignores Specific Fields 【发布时间】:2011-02-24 06:46:09 【问题描述】:

我正在重写这篇文章以澄清一些事情并为我遇到问题的虚拟列表提供完整的类定义。类的定义如下:

从 wx 导入 ListCtrl,LC_REPORT,LC_VIRTUAL,LC_HRULES,LC_VRULES,\ EVT_LIST_COL_CLICK、EVT_LIST_CACHE_HINT、EVT_LIST_COL_RIGHT_CLICK、\ ImageList, IMAGE_LIST_SMALL, Menu, MenuItem, NewId, ITEM_CHECK, Frame, \ EVT_MENU 类虚拟列表(ListCtrl): def __init__(self, parent, datasource = None, 风格 = LC_REPORT | LC_VIRTUAL | LC_HRULES | LC_VRULES): ListCtrl.__init__(self, parent, style = style) self.columns = [] self.il = ImageList(16, 16) self.Bind(EVT_LIST_CACHE_HINT, self.CheckCache) self.Bind(EVT_LIST_COL_CLICK, self.OnSort) 如果数据源不是无: self.datasource = 数据源 self.Bind(EVT_LIST_COL_RIGHT_CLICK,self.ShowAvailableColumns) self.datasource.list = 自我 自我填充() def SetDatasource(自我,数据源): self.datasource = 数据源 def CheckCache(自我,事件): self.datasource.UpdateCache(event.GetCacheFrom(), event.GetCacheTo()) def OnGetItemText(self, item, col): return self.datasource.GetItem(item, self.columns[col]) def OnGetItemImage(self, item): 返回 self.datasource.GetImg(item) def OnSort(自我,事件): self.datasource.SortByColumn(self.columns[event.Column]) 自我刷新() 定义更新计数(自我): self.SetItemCount(self.datasource.GetCount()) def 填充(自我): self.UpdateCount() self.datasource.MakeImgList(self.il) self.SetImageList(self.il, IMAGE_LIST_SMALL) self.ShowColumns() def ShowColumns(自我): 对于 col, (text, visible) in enumerate(self.datasource.GetColumnHeaders()): 如果可见: self.columns.append(文本) self.InsertColumn(col, text, width = -2) def 过滤器(自我,过滤器): self.datasource.Filter(过滤器) self.UpdateCount() 自我刷新() def ShowAvailableColumns(self, evt): colMenu = 菜单() self.id2item = 对于枚举(self.datasource.columns)中的 idx,(文本,可见): id = NewId() self.id2item[id] = (idx, visible, text) item = MenuItem(colMenu, id, text, kind = ITEM_CHECK) colMenu.AppendItem(项目) EVT_MENU(colMenu,id,self.ColumnToggle) item.Check(可见) 框架(自我,-1).PopupMenu(colMenu) colMenu.Destroy() def ColumnToggle(self, evt): 切换 = self.id2item[evt.GetId()] 如果切换[1]: idx = self.columns.index(toggled[2]) self.datasource.columns[toggled[0]] = (self.datasource.columns[toggled[0]][0], False) self.DeleteColumn(idx) self.columns.pop(idx) 别的: self.datasource.columns[toggled[0]] = (self.datasource.columns[toggled[0]][0], True) idx = self.datasource.GetColumnHeaders().index((toggled[2], True)) self.columns.insert(idx, toggled[2]) self.InsertColumn(idx, toggled[2], width = -2) self.datasource.SaveColumns()

我添加了允许列切换的功能,这有助于我描述我遇到的问题。在我的应用程序中此类的第三个实例中,索引 1 处的列将不会显示字符串值。整数值显示正确。如果我将打印语句添加到我的 OnGetItemText 方法,则值会正确显示在我的控制台中。这种行为在该类的前两个实例中不存在,并且我的类不包含任何关于值显示的类型检查代码。

wxPython 用户组中的某个人建议我创建一个独立的示例来演示这个问题,如果可以的话。我正在努力,但还没有时间创建一个不依赖于数据库访问的示例。任何建议或意见将不胜感激。我正在把头发扯下来。

【问题讨论】:

你确定是 ListCtrl 的错吗?在OnGetItemText 中尝试print item, col, data,看看它什么时候给你打电话以及你返回什么。 我注意到非显示值中有一个有趣的模式。在列表的实例中,我遇到了不显示包含字符串值的字段的问题。将显示的字段包含数值。该行为在我的应用程序中我的类的前两个实例中不存在,并且仅显示在第三个实例的索引 1 的列中。我的列表类中没有任何类型相关的代码。如果没有其他建议,下次我在代码前面时,我会用完整的类定义更新这篇文章。 如果有人感兴趣,我已经生成了一个独立的示例来演示此行为:groups.google.com/group/wxpython-users/browse_thread/thread/…。提前致谢。 为了尽职调查,我在另外两台机器上安装了上面的示例应用程序。一种是运行 64 位版本的 wx/Python 的 Windows 7,另一种是运行 32 位版本的 Windows 7。我的机器是 64 位 XP 并安装了 32 位二进制文​​件。使用独立样本时,所有三台机器都表现出相同的行为。 【参考方案1】:

您是否正在构建虚拟列表控件的 wxPython 演示代码?您需要做一些簿记工作,例如设置 ItemCount 属性。

关于您的 OnGetItemText 方法的评论:由于没有其他返回语句,如果数据为 None,它将返回 None,因此您的测试无效。

return data or "" 怎么样?

【讨论】:

if data is not None: 的测试在重构之前是有意义的。以前数据是一个字典对象,我试图从数据中返回值。如果数据是无,那么我得到一个关键错误。我已经改变了方法,所以我没有传递太多的数据,这使得检查变得无关紧要。感谢您指出这一点。我的全班确实正确设置了 ItemCount。我省略了部分类定义以节省空间。【参考方案2】:

Windows 中的本机对象存在问题。如果 GetImg 返回 None 而不是 -1,则由于某种原因,列表的第 1 列有问题。 Robin 在 Google Group 上针对此问题发布的帖子。

【讨论】:

以上是关于wxPython ListCtrl 列忽略特定字段的主要内容,如果未能解决你的问题,请参考以下文章

MFC ListCtrl如何查找某一行的上一行或者下一行

MFC 在ListCtrl中插入列后调试报错

LISTCTRL控件方法

忽略 Jackson 序列化的特定字段

通过忽略特定列将 HTML 表数据转换为 jQuery 中的 JSON 对象

如何忽略 JSON 响应中列表中的特定字段