この投稿を書き直して、いくつかのことを明確にし、問題のある仮想リストの完全なクラス定義を提供します。クラスは次のように定義されます。
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ユーザーグループの誰かから、可能であればこの問題を示すスタンドアロンサンプルを作成することが提案されました。私はそれに取り組んでいますが、データベースアクセスに依存しないサンプルを作成する時間がまだありません。任意の提案やアドバイスをいただければ幸いです。私はこれで私の髪を引き裂いています。