ULC_VIRTUAL模式下的UltimateListCtrl无法进行项目检查
以下是系统和软件信息
平台:Windows XP和OSX Lion
ActiveState Python2.7.2
WxPython2.9-osx-coco-py2.7(适用于osx)
WxPython2.9-win32-py27(适用于Windows XP)
我正在尝试使用ULC_VIRTUAL和ULC_REPORT模式创建一个UltimateListCtrl。我想知道如何在每一行的第一列旁边放置一个复选框并在用户选中复选框时捕捉事件。我可以在不使用虚拟模式的情况下使用UltimateListCtrl执行相同的操作。但是,在打开ULC_VIRTUAL标志的情况下,我不知道如何继续。以下是我创建的代码,但这仍然不允许我选中与第一列相关联的框。请帮帮忙。
选择 | 换行 | 行号
- import wx
- import images
- import random
- import os, sys
- from wx.lib.agw import ultimatelistctrl as ULC
- class TestUltimateListCtrl(ULC.UltimateListCtrl):
- def __init__(self, parent, log):
- ULC.UltimateListCtrl.__init__(self, parent, -1, agwStyle=ULC.ULC_AUTO_CHECK_CHILD|ULC.ULC_VIRTUAL|ULC.ULC_REPORT|ULC.ULC_SINGLE_SEL|ULC.ULC_VRULES|ULC.ULC_HRULES)
- self.SetItemCount(1000)
- self.table_fields=['First','Second','Third']
- field_index=0
- for field in self.table_fields:
- info = ULC.UltimateListItem()
- info._mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT | ULC.ULC_MASK_CHECK
- info._image = []
- info._format = wx.LIST_FORMAT_CENTER
- info._kind = 1
- info._text = field
- info._font= wx.Font(13, wx.ROMAN, wx.NORMAL, wx.BOLD)
- self.InsertColumnInfo(field_index, info)
- self.SetColumnWidth(field_index,175)
- field_index += 1
- def getColumnText(self, index, col):
- item = self.GetItem(index, col)
- return item.GetText()
- def OnGetItemText(self, item, col):
- return "Item %d, Column %d" % (item,col)
- def OnGetItemColumnImage(self, item, col):
- return []
- def OnGetItemImage(self, item):
- return []
- def OnGetItemAttr(self, item):
- return None
- def OnGetItemTextColour(self, item, col):
- return None
- #def OnGetItemColumnCheck(self, item, col):
- #return True
- #def OnGetItemCheck(self, item):
- #item=self.GetItem(item)
- #return item.IsChecked()
- def OnGetItemToolTip(self, item, col):
- return None
- def OnGetItemKind(self, item):
- return 1
- def OnGetItemColumnKind(self, item, col):
- if col==0:
- return self.OnGetItemKind(item)
- return 0
- class TestFrame(wx.Frame):
- def __init__(self, parent, log):
- wx.Frame.__init__(self, parent, -1, "UltimateListCtrl in wx.LC_VIRTUAL mode", size=(700, 600))
- panel = wx.Panel(self, -1)
- sizer = wx.BoxSizer(wx.VERTICAL)
- listCtrl = TestUltimateListCtrl(panel, log)
- sizer.Add(listCtrl, 1, wx.EXPAND)
- panel.SetSizer(sizer)
- sizer.Layout()
- self.CenterOnScreen()
- self.Show()
- if __name__ == '__main__':
- import sys
- app = wx.PySimpleApp()
- frame = TestFrame(None, sys.stdout)
- frame.Show(True)
- app.MainLoop()
顺便说一句,下面是我用来在没有虚拟模式的情况下创建相同东西的代码。在本例中,我可以选中每行第一列数据旁边的框。但是,我将与数万项工作,我不能依赖于加载的项目如下,因为它是非常缓慢的。因此,我想使用虚拟列表,但我不知道如何在其中获得相同的功能。
选择 | 换行 | 行号
- import wx
- import images
- import random
- import os, sys
- from wx.lib.agw import ultimatelistctrl as ULC
- class TestUltimateListCtrl(ULC.UltimateListCtrl):
- def __init__(self, parent, log):
- ULC.UltimateListCtrl.__init__(self, parent, -1, agwStyle=ULC.ULC_REPORT|ULC.ULC_SINGLE_SEL|ULC.ULC_VRULES|ULC.ULC_HRULES)
- self.table_fields=['First','Second','Third']
- field_index=0
- for field in self.table_fields:
- info = ULC.UltimateListItem()
- info._mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT | ULC.ULC_MASK_CHECK
- info._image = []
- info._format = wx.LIST_FORMAT_CENTER
- info._kind = 1
- info._text = field
- info._font= wx.Font(13, wx.ROMAN, wx.NORMAL, wx.BOLD)
- self.InsertColumnInfo(field_index, info)
- self.SetColumnWidth(field_index,175)
- field_index += 1
- for record_index in range(0,1000):
- for field in self.table_fields:
- if self.table_fields.index(field)==0:
- self.InsertStringItem(record_index, 'Item %d, Column %d' % (record_index,self.table_fields.index(field)),it_kind=1)
- else:
- self.SetStringItem(record_index, self.table_fields.index(field), 'Item %d, Column %d' % (record_index,self.table_fields.index(field)))
- class TestFrame(wx.Frame):
- def __init__(self, parent, log):
- wx.Frame.__init__(self, parent, -1, "UltimateListCtrl in wx.LC_VIRTUAL mode", size=(700, 600))
- panel = wx.Panel(self, -1)
- sizer = wx.BoxSizer(wx.VERTICAL)
- listCtrl = TestUltimateListCtrl(panel, log)
- sizer.Add(listCtrl, 1, wx.EXPAND)
- panel.SetSizer(sizer)
- sizer.Layout()
- self.CenterOnScreen()
- self.Show()
- if __name__ == '__main__':
- import sys
- app = wx.PySimpleApp()
- frame = TestFrame(None, sys.stdout)
- frame.Show(True)
- app.MainLoop()