Frage

Ich Umschreiben diesen Beitrag einige Dinge zu klären und eine vollständige Klassendefinition für die virtuelle Liste bietet das ich habe Probleme mit. Die Klasse wird definiert wie folgt:

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

Ich habe Funktionen hinzugefügt, die für Spalte Makeln ermöglichen, die meine Beschreibung des Problems erleichtern ich zu stoßen. Am 3. Instanz dieser Klasse in meiner Anwendung bei Index der Spalte 1 nicht String-Werte angezeigt werden. Integer-Werte werden korrekt angezeigt. Wenn ich print-Anweisungen meiner OnGetItemText Methode hinzufügen zeigen die Werte richtig in meiner Konsole nach oben. Dieses Verhalten ist in den ersten beiden Instanzen dieser Klasse nicht vorhanden ist, und meine Klasse enthält keinen Typencode in Bezug auf Wertanzeige zu überprüfen.

Es wurde von jemandem auf der Gruppe WxPython Benutzer vorgeschlagen, dass ich eine eigenständige Probe schaffen, die dieses Problem veranschaulicht, wenn ich kann. Ich arbeite an das, aber noch nicht Zeit gehabt, um eine Probe zu erstellen, die nicht auf den Datenbankzugriff angewiesen ist. Irgendwelche Vorschläge oder Rat würden die meisten geschätzt werden. Ich bin meine Haare auf dieser einer zu reißen.

War es hilfreich?

Lösung 2

Es gibt ein Problem mit dem nativen Objekt in Windows. Wenn GetImg gibt keine statt -1 hat die Liste ein Problem mit der Spalte 1 aus irgendeinem Grund. Das von Robin über auf dem Google-Gruppe Beitrag für dieses Problem.

Andere Tipps

Bauen Sie auf dem WxPython Demo-Code für die virtuelle Liste Kontrollen? Es gibt ein paar Buchhaltung Dinge, die Sie tun müssen, wie stellen Sie die Eigenschaft ItemCount.

Ein Kommentar über Ihre OnGetItemText Methode. Da es keine andere Anweisung return ist, wird es keine Rückkehr, wenn die Daten keine ist, so dass Ihr Test keine Wirkung

Wie wäre es return data or "" statt?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top