2010-05-26 96 views
2

我正在重寫這篇文章來澄清一些事情,併爲我遇到的虛擬列表提供完整的類定義。類的定義,像這樣:wxPython ListCtrl列忽略特定字段

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

我添加功能,允許爲列繃有利於我的,我遇到的問題的描述。在我的應用程序中該類的第三個實例中,索引1處的列不會顯示字符串值。整數值顯示正確。如果我將打印語句添加到我的OnGetItemText方法中,這些值將正確顯示在我的控制檯中。此行爲在此類的前兩個實例中不存在,並且我的類不包含與值顯示有關的任何類型檢查代碼。

有人在wxPython用戶組中建議我創建一個獨立的示例,如果可以的話,它將演示此問題。我正在處理這個問題,但還沒有時間創建一個不依賴數據庫訪問的示例。任何建議或意見將不勝感激。我在這一張上撕掉了我的頭髮。

+0

你確定ListCtrl是怪嗎?在'OnGetItemText'中嘗試'print item,col,data'來查看它何時打電話給你,以及你要返回什麼。 – FogleBird 2010-05-26 16:24:26

+0

我注意到非顯示值中有趣的模式。在列表的實例中,我遇到了不會顯示包含字符串值的字段的問題。將顯示的字段包含數字值。該行爲在我的應用程序的類的前兩個實例中不存在,並且僅在第三個實例的索引1的列中顯示。我的列表類中沒有任何類型相關的代碼。如果沒有其他建議,我會在代碼前面下一次完整的類定義來更新這篇文章。 – 2010-05-29 15:26:06

+0

如果有人感興趣,我已經生成了一個獨立示例,演示了此行爲:http://groups.google.com/group/wxpython-users/browse_thread/thread/f45b211af20e1cef/bdff95491b305400?lnk=raot#bdff95491b305400。提前致謝。 – 2010-06-01 16:36:52

回答

0

Windows中的本機對象存在問題。如果GetImg返回None而不是-1,則出於某種原因列表出現列1問題。來自Robin的Google Group發佈的這個問題。

0

您是否正在構建虛擬列表控件的wxPython演示代碼?你需要做幾件簿記工作,比如設置ItemCount屬性。

關於您的OnGetItemText方法的一個註釋:因爲沒有其他的返回語句,所以如果數據是None,它將返回None,所以您的測試不起作用。

return data or ""怎麼樣?

+0

對於「如果數據不是無:」的測試在重構之前是有意義的。以前的數據是一個字典對象,我試圖從數據中返回值。如果數據是None,那麼我有一個關鍵錯誤。我改變了方法,所以我沒有傳遞太多的數據,這使得檢查無關緊要。我感謝你指出了這一點。 我的全班確實設置了ItemCount。我省略了部分類定義以節省空間。 – 2010-05-26 18:02:55