Question

Je réécrire ce post pour clarifier certaines choses et de fournir une définition complète de classe pour la liste virtuelle Je vais avoir du mal avec. La classe est définie comme ceci:

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

J'ai ajouté des fonctions qui permettent la colonne Basculement qui facilitent ma description de la question que je rencontre. Le 3 instance de cette classe dans ma demande la colonne à l'index 1 ne sera pas afficher les valeurs String. Les valeurs entières sont affichées correctement. Si j'ajouter des instructions d'impression à ma méthode OnGetItemText les valeurs apparaissent dans ma console correctement. Ce comportement ne figure pas dans les deux premières instances de cette classe, et ma classe ne contient pas de code de vérification de type par rapport à l'affichage de la valeur.

Il a été suggéré par quelqu'un sur le groupe des utilisateurs wxPython que je crée un échantillon autonome qui illustre ce problème si je peux. Je travaille là-dessus, mais pas encore eu le temps de créer un échantillon qui ne repose pas sur l'accès aux bases de données. Toutes les suggestions ou des conseils seraient les plus appréciés. Je déchirer mes cheveux sur celui-ci.

Était-ce utile?

La solution 2

Il y a un problème avec l'objet natif dans Windows. Si GetImg retourne Aucun au lieu de -1 la liste a un problème avec la colonne 1 pour une raison quelconque. Que de Robin sur le poste du groupe Google pour cette question.

Autres conseils

Êtes-vous A partir du code de démonstration wxPython pour les contrôles de liste virtuelle? Il y a quelques choses de comptabilité que vous devez faire, comme définir la propriété ItemCount.

Un commentaire sur votre méthode OnGetItemText. Comme il n'y a pas d'autre déclaration de retour, elle retournera None si les données sont Aucun, si votre test n'a pas d'effet

Que diriez-vous à la place return data or ""?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top