::-- limodou [2005-10-21 15:14:49]

1. CheckList

可以在List的每行上显示一个CheckBox框,点击可以改变状态。

1.1. 代码

   1 import wx
   2 from wx import ImageFromStream, BitmapFromImage
   3 import cStringIO, zlib
   4 import wx.lib.mixins.listctrl as listmix
   5 import sys
   6 
   7 
   8 def getUncheckData():
   9     return zlib.decompress(
  10 "x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
  11 \x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xbb{\xba8\x86X\xf4\
  12 &\xa7\xa4$\xa5-`1\x08\\2\xbb\xb1\xb1\x91\xf5\xd8\x84o\xeb\xff\xfaw\x1d[.=[2\
  13 \x90'\x01\x08v\xec]\xd3\xa3qvU`l\x81\xd9\xd18\t\xd3\x84+\x0cll[\xa6t\xcc9\
  14 \xd4\xc1\xda\xc3<O\x9a1\xc3\x88\xc3j\xfa\x86_\xee@#\x19<]\xfd\\\xd69%4\x01\
  15 \x00\xdc\x80-\x05" )
  16 
  17 def getUncheckBitmap():
  18     return BitmapFromImage(getUncheckImage())
  19 
  20 def getUncheckImage():
  21     stream = cStringIO.StringIO(getUncheckData())
  22     return ImageFromStream(stream)
  23 
  24 #----------------------------------------------------------------------
  25 def getCheckData():
  26     return zlib.decompress(
  27 'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\
  28 \x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47{\xba8\x86X\xf4&\
  29 \xa7\xa4$\xa5-`1\x08\\2\xbb\xb1\xb1\x91\xf5\xd8\x84o\xeb\xff\xfaw\x1d[.=[2\
  30 \x90\'\x01\x08v\xec\\2C\xe3\xec+\xc3\xbd\x05fG\xe3\x14n1\xcc5\xad\x8a8\x1a\
  31 \xb9\xa1\xeb\xd1\x853-\xaa\xc76\xecb\xb8i\x16c&\\\xc2\xb8\xe9Xvbx\xa1T\xc3U\
  32 \xd6p\'\xbd\x85\x19\xff\xbe\xbf\xd7\xe7R\xcb`\xd8\xa5\xf8\x83\xe1^\xc4\x0e\
  33 \xa1"\xce\xc3n\x93x\x14\xd8\x16\xb0(\x15q)\x8b\x19\xf0U\xe4\xb10\x08V\xa8\
  34 \x99\xf3\xdd\xde\xad\x06t\x0e\x83\xa7\xab\x9f\xcb:\xa7\x84&\x00\xe0HE\xab' )
  35 
  36 def getCheckBitmap():
  37     return BitmapFromImage(getCheckImage())
  38 
  39 def getCheckImage():
  40     stream = cStringIO.StringIO(getCheckData())
  41     return ImageFromStream(stream)
  42 
  43 class List(wx.ListView, listmix.ListCtrlAutoWidthMixin):
  44     def __init__(self, parent, columns, style=wx.LC_REPORT):
  45         wx.ListView.__init__(self, parent, -1, style=style)
  46         listmix.ListCtrlAutoWidthMixin.__init__(self)
  47         self.parent = parent
  48         self.columns = columns
  49 
  50         self.createlist(self.columns)
  51 
  52     def createlist(self, columns):
  53         self.columns_num = len(columns)
  54 
  55         self.DeleteAllItems()
  56 
  57         for i, v in enumerate(columns):
  58             info = wx.ListItem()
  59             info.m_mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_FORMAT
  60 
  61             name, length, align = v
  62 
  63             if align == 'left':
  64                 info.m_format = wx.LIST_FORMAT_LEFT
  65             elif align == 'center':
  66                 info.m_format = wx.LIST_FORMAT_CENTER
  67             else:
  68                 info.m_format = wx.LIST_FORMAT_RIGHT
  69             info.m_text = name
  70             self.InsertColumnInfo(i, info)
  71             self.SetColumnWidth(i, length)
  72 
  73     def load(self, getdata):
  74         for v in getdata():
  75             i = v[0]
  76             index = self.InsertStringItem(sys.maxint, i)
  77             for i, t in enumerate(v[1:]):
  78                 self.SetStringItem(index, i+1, t)
  79 
  80     def GetValue(self):
  81         for i in range(self.GetItemCount()):
  82             s = []
  83             for j in range(self.GetColumnCount()):
  84                 s.append(self.GetItem(i, j).GetText())
  85             yield tuple(s)
  86 
  87 class CheckListMixin:
  88     def __init__(self):
  89         self.imagelist = wx.ImageList(16, 16)
  90         self.uncheck_image = self.imagelist.Add(getUncheckBitmap())
  91         self.check_image = self.imagelist.Add(getCheckBitmap())
  92         self.SetImageList(self.imagelist, wx.IMAGE_LIST_SMALL)
  93 
  94         wx.EVT_LEFT_DOWN(self, self.OnLeftDown)
  95 
  96         self.values = {}
  97 
  98     def load(self, getdata):
  99         self.values = {}
 100         for flag, v in getdata():
 101             index = self.InsertImageStringItem(sys.maxint, v[0], int(flag))
 102             self.values[index] = int(flag)
 103             self.SetItemData(index, index)
 104             for i, t in enumerate(v[1:]):
 105                 self.SetStringItem(index, i+1, t)
 106 
 107     def OnLeftDown(self,event):
 108         (index, flags) = self.HitTest(event.GetPosition())
 109         if flags == wx.LIST_HITTEST_ONITEMICON:
 110             i = self.GetItemData(index)
 111             self.values[i] ^= 1
 112             self.SetItemImage(index, self.values[i])
 113             self.OnCheck(index, self.values[i])
 114         event.Skip()
 115 
 116     def OnCheck(self, index, f):
 117         pass
 118 
 119     def GetValue(self):
 120         for i in range(self.GetItemCount()):
 121             s = []
 122             for j in range(self.GetColumnCount()):
 123                 s.append(self.GetItem(i, j).GetText())
 124             yield (self.values[self.GetItemData(i)], tuple(s))
 125 
 126     def getFlag(self, index):
 127         i = self.GetItemData(index)
 128         return self.values[i]
 129 
 130     def setFlag(self, index, f):
 131         i = self.GetItemData(index)
 132         self.values[i] = f
 133         self.SetItemImage(index, self.values[i])
 134 
 135     def notFlag(self, index):
 136         f = self.getFlag(index)
 137         self.setFlag(f ^ 1)
 138 
 139 class CheckList(List, CheckListMixin):
 140     def __init__(self, parent, columns, style=wx.LC_REPORT):
 141         List.__init__(self, parent, columns, style=style)
 142         CheckListMixin.__init__(self)
 143 
 144     def load(self, getdata):
 145         CheckListMixin.load(self, getdata)
 146 
 147     def GetValue(self):
 148         for i in CheckListMixin.GetValue(self):
 149             yield i