2

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

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

4

2 回答 2

0

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

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

换成怎么样return data or ""

于 2010-05-26T17:54:16.623 回答
0

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

于 2010-06-02T02:31:35.210 回答