我正在重寫這篇文章來澄清一些事情,併爲我遇到的虛擬列表提供完整的類定義。類的定義,像這樣: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用戶組中建議我創建一個獨立的示例,如果可以的話,它將演示此問題。我正在處理這個問題,但還沒有時間創建一個不依賴數據庫訪問的示例。任何建議或意見將不勝感激。我在這一張上撕掉了我的頭髮。
你確定ListCtrl是怪嗎?在'OnGetItemText'中嘗試'print item,col,data'來查看它何時打電話給你,以及你要返回什麼。 – FogleBird 2010-05-26 16:24:26
我注意到非顯示值中有趣的模式。在列表的實例中,我遇到了不會顯示包含字符串值的字段的問題。將顯示的字段包含數字值。該行爲在我的應用程序的類的前兩個實例中不存在,並且僅在第三個實例的索引1的列中顯示。我的列表類中沒有任何類型相關的代碼。如果沒有其他建議,我會在代碼前面下一次完整的類定義來更新這篇文章。 – 2010-05-29 15:26:06
如果有人感興趣,我已經生成了一個獨立示例,演示了此行爲:http://groups.google.com/group/wxpython-users/browse_thread/thread/f45b211af20e1cef/bdff95491b305400?lnk=raot#bdff95491b305400。提前致謝。 – 2010-06-01 16:36:52