Столбец wxPython ListCtrl игнорирует определенные поля - PullRequest
2 голосов
/ 26 мая 2010

Я переписываю этот пост, чтобы прояснить некоторые вещи и дать полное определение класса для Виртуального списка, с которым у меня проблемы. Класс определяется так:

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()

Я добавил функции, которые позволяют переключать столбцы, которые облегчают мое описание проблемы, с которой я сталкиваюсь. На 3-м экземпляре этого класса в моем приложении столбец с индексом 1 не будет отображать строковые значения. Целочисленные значения отображаются правильно. Если я добавлю операторы print в мой метод OnGetItemText, значения будут правильно отображаться в моей консоли. Такое поведение отсутствует в первых двух экземплярах этого класса, и мой класс не содержит никакого кода проверки типа относительно отображения значения.

Кто-то из группы пользователей wxPython предложил мне создать автономный образец, демонстрирующий эту проблему, если смогу. Я работаю над этим, но у меня еще не было времени создать пример, не основанный на доступе к базе данных. Любые предложения или советы будут наиболее ценными. На этом я рву волосы.

Ответы [ 2 ]

0 голосов
/ 02 июня 2010

Есть проблема с собственным объектом в Windows. Если GetImg возвращает None вместо -1, по какой-то причине в списке возникла проблема со столбцом 1. Это от Робина из сообщения группы Google по этому вопросу.

0 голосов
/ 26 мая 2010

Вы используете демонстрационный код wxPython для управления виртуальными списками? Есть несколько вещей, которые вам нужно сделать, например, установить свойство ItemCount.

Один комментарий о вашем методе OnGetItemText: поскольку нет другого оператора return, он вернет None, если данные None, поэтому ваш тест не имеет никакого эффекта.

Как насчет return data or "" вместо?

...