我正在重写这篇文章以澄清一些事情并为我遇到问题的虚拟列表提供完整的类定义。该类的定义如下:
从 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 用户组中的某个人建议我创建一个独立的示例来演示这个问题,如果可以的话。我正在努力,但还没有时间创建一个不依赖于数据库访问的示例。任何建议或意见将不胜感激。我正在把头发扯下来。