2

この投稿を書き直して、いくつかのことを明確にし、問題のある仮想リストの完全なクラス定義を提供します。クラスは次のように定義されます。

wxからimportListCtrl、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

クラスVirtualList(ListCtrl):
  def __init __(self、parent、datasource = None、
               スタイル=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)

    データソースがNoneでない場合:
      self.datasource=データソース
      self.Bind(EVT_LIST_COL_RIGHT_CLICK、self.ShowAvailableColumns)

      self.datasource.list = self

      self.Populate()

  def SetDatasource(self、datasource):
    self.datasource=データソース

  def CheckCache(self、event):
    self.datasource.UpdateCache(event.GetCacheFrom()、event.GetCacheTo())

  def OnGetItemText(self、item、col):
    self.datasource.GetItem(item、self.columns [col])を返します

  def OnGetItemImage(self、item):
    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):
    enumerate(self.datasource.GetColumnHeaders())のcol、(text、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 = {}

    idxの場合、enumerate(self.datasource.columns)の(text、visible):
      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(表示)

    Frame(self、-1).PopupMenu(colMenu)

    colMenu.Destroy()

  def ColumnToggle(self、evt):
    トグル=self.id2item[evt.GetId()]

    トグルされた場合[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)

    そうしないと:
      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の列に文字列値が表示されません。整数値が正しく表示されます。OnGetItemTextメソッドにprintステートメントを追加すると、値がコンソールに正しく表示されます。この動作は、このクラスの最初の2つのインスタンスには存在せず、私のクラスには、値の表示に関する型チェックコードが含まれていません。

wxPythonユーザーグループの誰かから、可能であればこの問題を示すスタンドアロンサンプルを作成することが提案されました。私はそれに取り組んでいますが、データベースアクセスに依存しないサンプルを作成する時間がまだありません。任意の提案やアドバイスをいただければ幸いです。私はこれで私の髪を引き裂いています。

4

2 に答える 2

0

仮想リストコントロール用のwxPythonデモコードに基づいて構築していますか?ItemCountプロパティの設定など、実行する必要のある簿記がいくつかあります。

OnGetItemTextメソッドに関する1つのコメント:他にreturnステートメントがないため、データがNoneの場合はNoneが返されるため、テストは効果がありません。

return data or ""代わりにどうですか?

于 2010-05-26T17:54:16.623 に答える
0

Windowsのネイティブオブジェクトに問題があります。GetImgが-1ではなくNoneを返す場合、何らかの理由でリストの列1に問題があります。この問題に関するGoogleグループの投稿でのロビンからのそれ。

于 2010-06-02T02:31:35.210 に答える