wxPython ListCtrl列忽略特定字段

wxPython ListCtrl列忽略特定字段,python,wxpython,listctrl,Python,Wxpython,Listctrl,我重写这篇文章是为了澄清一些事情,并为我遇到麻烦的虚拟列表提供完整的类定义。该类的定义如下: from wx import 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_C

我重写这篇文章是为了澄清一些事情,并为我遇到麻烦的虚拟列表提供完整的类定义。该类的定义如下:

from wx import 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 class VirtualList(ListCtrl): def __init__(self, parent, datasource = None, style = 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) if datasource is not None: self.datasource = datasource self.Bind(EVT_LIST_COL_RIGHT_CLICK, self.ShowAvailableColumns) self.datasource.list = self self.Populate() def SetDatasource(self, datasource): self.datasource = datasource def CheckCache(self, event): self.datasource.UpdateCache(event.GetCacheFrom(), event.GetCacheTo()) def OnGetItemText(self, item, col): return self.datasource.GetItem(item, self.columns[col]) def OnGetItemImage(self, item): return self.datasource.GetImg(item) def OnSort(self, event): self.datasource.SortByColumn(self.columns[event.Column]) self.Refresh() def UpdateCount(self): self.SetItemCount(self.datasource.GetCount()) def Populate(self): self.UpdateCount() self.datasource.MakeImgList(self.il) self.SetImageList(self.il, IMAGE_LIST_SMALL) self.ShowColumns() def ShowColumns(self): for col, (text, visible) in enumerate(self.datasource.GetColumnHeaders()): if visible: self.columns.append(text) self.InsertColumn(col, text, width = -2) def Filter(self, filter): self.datasource.Filter(filter) self.UpdateCount() self.Refresh() def ShowAvailableColumns(self, evt): colMenu = Menu() self.id2item = {} for idx, (text, visible) in enumerate(self.datasource.columns): id = NewId() self.id2item[id] = (idx, visible, text) item = MenuItem(colMenu, id, text, kind = ITEM_CHECK) colMenu.AppendItem(item) EVT_MENU(colMenu, id, self.ColumnToggle) item.Check(visible) Frame(self, -1).PopupMenu(colMenu) colMenu.Destroy() def ColumnToggle(self, evt): toggled = self.id2item[evt.GetId()] if toggled[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) else: 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() 我已经添加了允许列切换的函数,这有助于我描述我遇到的问题。在我的应用程序中该类的第3个实例上,索引1处的列将不显示字符串值。整数值显示正确。如果我将print语句添加到OnGetItemText方法中,那么这些值将正确地显示在控制台中。此类的前两个实例中不存在此行为,并且我的类不包含任何与值显示相关的类型检查代码


wxPython用户组的某个人建议,如果可以的话,我创建一个独立的示例来演示这个问题。我正在研究这个问题,但还没有时间创建一个不依赖数据库访问的示例。如有任何建议或建议,将不胜感激。这件事让我抓狂。

你是在为虚拟列表控件构建wxPython演示代码吗?您需要做一些簿记工作,比如设置ItemCount属性

关于OnGetItemText方法的一点意见是:由于没有其他返回语句,如果数据为None,它将返回None,因此测试没有效果


返回数据或者取而代之怎么样?

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

关于OnGetItemText方法的一点意见是:由于没有其他返回语句,如果数据为None,它将返回None,因此测试没有效果


返回数据或者取而代之怎么样?

Windows中的本机对象有问题。如果GetImg返回None而不是-1,则由于某种原因,列表的第1列有问题。这是罗宾在谷歌集团发布的这期文章中提到的。

Windows中的本机对象有问题。如果GetImg返回None而不是-1,则由于某种原因,列表的第1列有问题。这是罗宾在谷歌集团发布的关于这个问题的帖子。

你确定ListCtrl是罪魁祸首吗?尝试在OnGetItemText中打印项目、列和数据,以查看它何时调用您以及您返回的内容。我注意到非显示值中有一个有趣的模式。在列表的实例中,我对不显示包含字符串值的字段有问题。将显示的字段包含数值。在我的应用程序中,该行为不出现在类的前两个实例中,而只出现在第三个实例的索引1列中。我的list类中没有任何与类型相关的代码。如果没有其他建议,我将在下一次看到代码时使用完整的类定义更新此帖子。如果有人感兴趣,我已经生成了一个独立的示例来演示此行为:。提前感谢。为了尽职调查,我在另外两台机器上安装了上面的示例应用程序。一个是运行64位版本wx/Python的Windows 7,另一个是运行32位版本的Windows 7。我的机器是XP 64位,安装了32位二进制文件。使用独立示例时,所有三台计算机都表现出相同的行为。您确定ListCtrl是罪魁祸首吗?尝试在OnGetItemText中打印项目、列和数据,以查看它何时调用您以及您返回的内容。我注意到非显示值中有一个有趣的模式。在列表的实例中,我对不显示包含字符串值的字段有问题。将显示的字段包含数值。在我的应用程序中,该行为不出现在类的前两个实例中,而只出现在第三个实例的索引1列中。我的list类中没有任何与类型相关的代码。如果没有其他建议,我将在下一次看到代码时使用完整的类定义更新此帖子。如果有人感兴趣,我已经生成了一个独立的示例来演示此行为:。提前感谢。为了尽职调查,我在另外两台机器上安装了上面的示例应用程序。一个是运行64位版本wx/Python的Windows 7,另一个是运行32位版本的Windows 7。我的机器是XP 64位,安装了32位二进制文件。这三台机器在使用独立样本时表现出相同的行为。如果数据不是无:在重构之前测试是有意义的。以前的数据是dictionary对象,我试图从数据返回值。如果数据为无,则我得到一个关键错误。我已经改变了方法,所以我没有传递太多的数据,这使得检查变得无关重要。我感谢你指出这一点。我的完整类确实正确设置了ItemCount。我省略了d班的部分内容 定义以节省空间。如果数据不是无:在重构之前测试是有意义的。以前的数据是dictionary对象,我试图从数据返回值。如果数据为无,则我得到一个关键错误。我已经改变了方法,所以我没有传递太多的数据,这使得检查变得无关重要。我感谢你指出这一点。我的完整类确实正确设置了ItemCount。为了节省空间,我省略了部分类定义。