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_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()
我添加了一些功能,可以切换列,这样更方便我描述我遇到的问题。在我应用程序中的第三个这个类实例中,索引为1的列无法显示字符串值,而整数值却能正常显示。如果我在我的OnGetItemText方法中添加打印语句,控制台中能正确显示这些值。这个问题在前两个实例中没有出现,而且我的类中没有任何关于值显示的类型检查代码。
在wxPython用户组中,有人建议我创建一个独立的示例来演示这个问题,如果可以的话。我正在努力做这个,但还没有时间创建一个不依赖于数据库访问的示例。任何建议或意见都将非常感谢。我对此真是抓狂。
2 个回答
0
你是在使用wxPython的示例代码来制作虚拟列表控件吗?有一些管理上的事情你需要注意,比如要设置ItemCount这个属性。
关于你的OnGetItemText方法,有一点需要说明:因为没有其他的返回语句,如果数据是None,它就会返回None,所以你的测试没有什么作用。
那不如试试用return data or ""
呢?
0
在Windows系统中,原生对象有个问题。如果GetImg返回的是None而不是-1,那么列表在某种情况下会在第一列出现问题。这是Robin在Google Group的帖子中提到的。