Pregunta

Estoy volver a escribir este post para aclarar algunas cosas y proporcionar una definición de clase completo para la Lista virtual que estoy teniendo problemas con el. La clase se define así:

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

He añadido funciones que permiten la Columna Conmutación que facilitan mi descripción del problema que estoy encontrando. En la tercera instancia de esta clase en mi solicitud de la columna con índice 1 no mostrará valores de cadena. Los valores enteros se muestran correctamente. Si añado declaraciones de impresión a mi método OnGetItemText los valores se muestran en mi consola correctamente. Este comportamiento no está presente en las dos primeras instancias de esta clase, y mi clase no contiene ningún tipo de comprobación de código con respecto a la indicación del valor.

Se sugirió por alguien en el grupo de usuarios wxPython que creo una muestra independiente que muestra este problema si puedo. Estoy trabajando en eso, pero aún no he tenido tiempo para crear una muestra que no se basa en el acceso de base de datos. Cualquier sugerencia o consejo sería lo más apreciado. Estoy rasgando mi pelo hacia fuera en éste.

¿Fue útil?

Solución 2

Hay un problema con el objeto nativo en Windows. Si GetImg devuelve None en lugar de -1 la lista tiene un problema con la columna 1 por alguna razón. Que a partir de Robin sobre en el poste de Google Grupo para este problema.

Otros consejos

¿Está construyendo en el código de demostración wxPython para los controles de lista virtuales? Hay un par de cosas de contabilidad que tiene que hacer, como establecer la propiedad ItemCount.

Un comentario acerca de su método OnGetItemText:. Como no hay otra instrucción de retorno, volverá Ninguno Ninguno si los datos son, por lo que su prueba no tiene ningún efecto

¿Qué hay de return data or "" lugar?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top