代码之家  ›  专栏  ›  技术社区  ›  g.d.d.c

wxpython listcrl列忽略特定字段

  •  2
  • g.d.d.c  · 技术社区  · 16 年前

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

    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处的列将不显示字符串值。整数值显示正确。如果我将print语句添加到ongetitemtext方法中,这些值就会正确地显示在控制台中。此类的前两个实例中不存在此行为,并且我的类不包含与值显示相关的任何类型检查代码。

    wxpython用户组中的某个人建议我创建一个独立的示例,如果可以的话,它将演示这个问题。我正在研究这个问题,但还没有时间创建一个不依赖数据库访问的示例。任何建议或建议都将是最受欢迎的。我要把头发扯下来。

    2 回复  |  直到 16 年前
        1
  •  0
  •   Ryan Ginstrom    16 年前

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

    关于ongetitemtext方法的一个注释是:由于没有其他的返回语句,如果数据为空,它将返回none,因此测试没有效果。

    怎么样 return data or "" 相反?

        2
  •  0
  •   g.d.d.c    16 年前

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