wxpython wx listctrl_wxpython 封装listctrl 支持添加控件 | 学步园

http://blog.csdn.net/xugangjava/article/details/7951605

#now not use

class AbstractList(wx.ListCtrl,

listmix.ListCtrlAutoWidthMixin,

listmix.ColumnSorterMixin):

def __init__(self, parent,columes,editlabel=False):

"""list 控件封装 提供表头排序功能,建议使用"""

wx.ListCtrl.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize, wx.LC_REPORT |\

wx.SUNKEN_BORDER)

listmix.ListCtrlAutoWidthMixin.__init__(self)

listmix.ColumnSorterMixin.__init__(self, len(columes))

self.SetColumns(columes)

self.ImageList = FileImageList()

self.AssignImageList(self.ImageList, wx.IMAGE_LIST_SMALL)

if editlabel:

self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT,self.EvtBeginEditLabel)

self.Bind(wx.EVT_LIST_END_LABEL_EDIT,self.EvtEndEditLabel)

self.pyData = ListPyData(self)

self.itemDataMap = {}

self.Bind(wx.EVT_RIGHT_DOWN, self.EvtContextMenu)

def EvtContextMenu(self,evt):

pMenu=self.InitPopuMenu()

assert pMenu

self.PopupMenu(pMenu)

pMenu.Destroy()

def InitPopuMenu(self):

"""init poup menu"""

def EvtEndEditLabel(self,evt):

"""end edit label"""

def EvtBeginEditLabel(self,evt):

"""begein edit label"""

evt.Allow()

def SetColumns(self, columes):

"""添加表头信息"""

i = 0

for name, width in columes:

self.InsertColumn(i, name)

if width: self.SetColumnWidth(i, width)

else: self.setResizeColumn(i)

i += 1

def GetListCtrl(self):

"""这个方法只是为了表头排序"""

return self

def GetPyData(self,idx):

return self.pyData.get(idx)

def RemovePyData(self,idx):

del self.pyData[idx]

def RawIconAndRow(self, item):

"""格式化对象,添加到每一列中去"""

NotImplemented('RawIconAndRow')

def AddRow(self, item, idx=sys.maxint):

icon, row = self.RawIconAndRow(item)

idx = self.InsertImageStringItem(idx, row[0], icon)

cols_num=len(row)

for i in xrange(cols_num):

self.SetStringItem(idx, i, row[i])

self.pyData[idx] = item

self.itemDataMap[idx] = row

return idx

########################################################################

class AbstractControlList(AbstractList):

def __init__(self, parent,columes,editlabel=False):

AbstractList.__init__(self, parent,columes,editlabel)

self.Bind(wx.EVT_PAINT,self.PaintControl)

self.Bind(wx.EVT_LIST_COL_DRAGGING, self.PaintControl)

self.Bind(wx.EVT_LIST_COL_END_DRAG, self.PaintControl)

self.Bind(wx.EVT_SCROLL, self.PaintControl)

def GetControlColNum(self):

NotImplemented('GetControlColNum')

def GetControlItem(self,item,col):

NotImplemented('GetCellControl')

def RefreshColumText(self,rowidx):

"""refreshText of the list"""

def PaintControl(self,evt):

count=self.GetItemCount()

control_cols=self.GetControlColNum()

for rowidx in xrange(count):

for col in control_cols:

item=self.pyData[rowidx]

control=self.GetControlItem(item,col)

rect=self.GetCellRect(rowidx,col)

control.SetDimensions(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2)

control.Update()

self.RefreshColumText(rowidx)

def DeleteItem(self, idx):

control_cols=self.GetControlColNum()

pyData=self.GetPyData(idx)

assert pyData

for col in control_cols:

control=self.GetControlItem(pyData,col)

control.Hide()

control=None

self.RemovePyData(idx)

AbstractList.DeleteItem(self,idx)

def DeleteAllItems(self):

control_cols=self.GetControlColNum()

for pyData in self.pyData.values():

for col in control_cols:

control=self.GetControlItem(pyData,col)

control.Destory()

self.pyData.clear()

AbstractList.DeleteAllItems(self)

def RawIconAndRow(self, item):

"""格式化对象,添加到每一列中去"""

NotImplemented('RawIconAndRow')

def AddRow(self, item, idx=sys.maxint):

icon, row = self.RawIconAndRow(item)

idx = self.InsertImageStringItem(idx, row[0], icon)

row_cout=len(row)

control_cols=self.GetControlColNum()

for i in xrange(row_cout):

if i in control_cols:

row[i]=''

else:

self.SetStringItem(idx, i, row[i])

self.pyData[idx] = item

self.itemDataMap[idx] = row

return idx

def _GetColumnWidthExtent(self, col):

col_locs,loc = [0],0

num_cols = min(col+1, self.GetColumnCount())

for n in xrange(num_cols):

loc += self.GetColumnWidth(n)

col_locs.append(loc)

x0 = col_locs[col]

x1 = col_locs[col+1] - 1

return x0, x1

def GetColumnRect(self, col):

x0, x1 = self._GetColumnWidthExtent(col)

r = self.GetItemRect(0)

y0 = r.y

y1 = self.GetClientSize()[1]

x_scroll = self.GetScrollPos(wx.HORIZONTAL)

return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))

def GetCellRect(self, row, col):

x0, x1 = self._GetColumnWidthExtent(col)

r = self.GetItemRect(row)

y0 = r.y

y1 = r.GetBottom()

x_scroll = self.GetScrollPos(wx.HORIZONTAL)

return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))

运行效果

2012 12 9

发现原先实现的比较难用,更新简化代码,,使用issubleclass判断 row是否为控件,如果为控件则保存到一个拉链链表中

ZiperMap(代码在http://blog.csdn.net/xugangjava/article/details/7532382)

class AbstractControlList(AbstractList):

def __init__(self, parent,columes,editlabel=False,style=wx.LC_REPORT):

AbstractList.__init__(self, parent,columes,editlabel,False,style)

self.Bind(wx.EVT_PAINT,self.PaintControl)

self.Bind(wx.EVT_LIST_COL_DRAGGING, self.PaintControl)

self.Bind(wx.EVT_LIST_COL_END_DRAG, self.PaintControl)

self.Bind(wx.EVT_SCROLL, self.PaintControl)

self.pyContol=ZipperMap()

def RefreshColumText(self,rowidx):

"""refreshText of the list"""

def PaintControl(self,evt):

count=self.GetItemCount()

for rowidx in xrange(count):

pyData=self.GetPyData(rowidx)

index_control=self.pyContol.get(id(pyData))

if not index_control:continue

for col,control in index_control:

rect=self.GetCellRect(rowidx,col)

control.SetDimensions(rect.x + 1, rect.y + 1, rect.width - 2, rect.height - 2)

self.RefreshColumText(rowidx)

evt.Skip()

def DeleteItem(self, idx):

pyData=self.GetPyData(idx)

assert pyData

index_control=self.pyContol.get(id(pyData))

if index_control:

for col,control in index_control:

self.__DropControl(control)

AbstractList.DeleteItem(self,idx)

def __DropControl(self,control):

control.Hide()

control.Destroy()

del control

def DeleteAllItems(self):

for pyData in self.pyData.values():

index_control=self.pyContol.get(id(pyData))

if not index_control:continue

for col,control in index_control:

self.__DropControl(control)

del self.pyContol[id(pyData)]

AbstractList.DeleteAllItems(self)

def RawIconAndRow(self, item):

"""格式化对象,添加到每一列中去"""

NotImplemented('RawIconAndRow')

def AddRow(self, item, idx=sys.maxint):

icon, row = self.RawIconAndRow(item)

idx = self.InsertImageStringItem(idx, row[0], icon)

row_cout=len(row)

for i in xrange(row_cout):

if issubclass(type(row[i]),wx.Control):

self.pyContol[id(item)]=i,row[i]

row[i]=''

else:

self.SetStringItem(idx, i, row[i])

self.pyData[idx] = item

self.itemDataMap[idx] = row

return idx

def _GetColumnWidthExtent(self, col):

col_locs,loc = [0],0

num_cols = min(col+1, self.GetColumnCount())

for n in xrange(num_cols):

loc += self.GetColumnWidth(n)

col_locs.append(loc)

x0 = col_locs[col]

x1 = col_locs[col+1] - 1

return x0, x1

def GetColumnRect(self, col):

x0, x1 = self._GetColumnWidthExtent(col)

r = self.GetItemRect(0)

y0 = r.y

y1 = self.GetClientSize()[1]

x_scroll = self.GetScrollPos(wx.HORIZONTAL)

return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))

def GetCellRect(self, row, col):

x0, x1 = self._GetColumnWidthExtent(col)

r = self.GetItemRect(row)

y0 = r.y

y1 = r.GetBottom()

x_scroll = self.GetScrollPos(wx.HORIZONTAL)

return wx.RectPP(wx.Point(x0 - x_scroll, y0),wx.Point(x1 - x_scroll, y1))

直接使用RawIconAndRow 传入控件既可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值