这次学习了高级列表控件的创建、排序和带位图的列表。
一、高级列表控件ListCtrl采用列表的表达方式显示信息,可以对列表项进行排列,并能够定制列表的显示样式,如详细列表模式、图标模式等。列表控件的创建有两种方法,第一种方法是直接实例化wx.ListCtrl类,然后关联列表数据。第二种是自定义列表控件类,继承wx.ListCtrl或wx.lib.minis.listctrl包中的mixni类,下面就用这种方法实现列表的创建,并用ListCtrlAutoWidthMixin类实现列表的自动对齐功能。
import sys
import wx
import wx.lib.mixins.listctrl as listmix
#定义字典data做为列表控件的数据
data = {1 : ("1","listctrl",u'列表控件'),
2 : ("2","grid",u'表格控件'),
3 : ("3","tree",u'树控件'),
4 : ("4","timer",u'定时器控件')}
#定义mylistctrl类,该类继承了wx.ListCtrl和listmix.ListCtrlAutoWidthMixin类
class MyListCtrl(wx.ListCtrl,listmix.ListCtrlAutoWidthMixin):
def __init__(self,parent,ID,pos=wx.DefaultPosition,size=wx.DefaultSize,style=0):
wx.ListCtrl.__init__(self,parent,ID,pos,size,style)
#使列的宽度与ListCtrl的宽度自动对齐
listmix.ListCtrlAutoWidthMixin.__init__(self)
#调用setColumns()函数设置列表数据
self.setColumns()
def setColumns(self):
#定义列头
self.InsertColumn(0,u'第1列')
self.InsertColumn(1,u"第2列")
self.InsertColumn(2,u'第3列')
#设置各列中的值
items = data.items()
for key,values in items:
#调用InSetringItem()方法在列表中添加一行,返回行索引index
index = self.InsertStringItem(sys.maxsize,values[0])
for i in range(len(values)):
#调用SetStringItem()方法设置第index行第i列单元格的内容
self.SetStringItem(index,i,values[i])
#设置列的宽度
self.SetColumnWidth(0,100)
self.SetColumnWidth(1,100)
#第3列的宽度自动对齐(调节剩余的宽度)
#第2个参数设置为wx.LC_REPORT
self.SetColumnWidth(2,wx.LIST_AUTOSIZE)
#实例化MyListCtrl类,设置ListCtrl类的style为wx.LC_REPORT,表示详细信息列表
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,title=u'列表控件',size=(400,200))
sizer = wx.BoxSizer(wx.VERTICAL)
self.List = MyListCtrl(self,-1,style=wx.LC_REPORT)
sizer.Add(self.List,1,wx.EXPAND)
self.SetSizer(sizer)
if __name__=='__main__':
app = wx.App()
frame = MyFrame()
frame.Show()
app.MainLoop()
二、用ListCtrl控件单击列表种的列标题时对当前列的数据进行排序,需要在MyFrame类种继承ColumnSoerterMixin类,排序是需要对列表控件的每列进行排序,所以是在MyListCtrl控件的容器类种添加MyFrame中添加排序功能。
所以只要改一下上面MyFrame类中的代码就可以了:
#列表控件的排序(接上例)
class MyFrame(wx.Frame,listmix.ColumnSorterMixin):
def __int__(self):
wx.Frame.__init__(self,None,u'列表控件',size=(400,200))
sizer = wx.BoxSizer(wx.VERTICAL)
#实例化MyListCtrl类,设置列表控件为详细列表,并按照升序排列
self.list = MyListCtrl(self,-1,style=wx.LC_REPORT
|wx.BORDER_NONE
|wx.LC_SORT_ASCENDING)
sizer.Add(self.list,1,wx.EXPAND)
#必须给itedatamap属性赋值
self.itemDataMap = data #用于排序的字典数据
listmix.ColumnSorterMixin.__init__(self,len(data))
self.SetSizer(sizer)
self.SetAutoLayout(True)
#继承ColumnSorterMixin类后,必须实现GetListCtrl()返回列表对象
def GetListCtrl(self):
return self.list
三、带位图的列表控件也就是有图标模式,创建步骤如下:
(1)创建ImageList对象存储图标资源wx.Bitmap对象;
(2)创建ListCtrl控件,并设置style为wx.LC_ICON;
(3)调用AssignImageList()方法关联ImageList对象;
(4)调用InsertImageStringItem()方法插入列表项,并设置图标的说明字符串。
#带位图的控件列表
import wx
import sys,glob
#定义字典类型,存放列表图标的说明字符串
data = {0:"prior",1:"next",2:"house",3:"save",4:"setting"}
class MyFrame(wx.Frame):
def __int__(self):
wx.Frame.__init__(self,None,-1,u'带位图的列表',size=(200,180))
i1 =wx.ImageList(16,16,True) #创建图像列表,存放16*16像素的图片
for name in glob.glob("image/icon?.png"): #搜索image子目录下的图标
bmp = wx.Bitmap(name,wx.BITMAP_TYPE_PNG)
i1.Add(bmp)
#根据Frame窗口的大小自动排列
self.list = wx.ListCtrl(self,-1,style=wx.LC_ICON|wx.LC_AUTOARRANGE)
#把图标列表关联到列表控件中
self.list.AssignImageList(i1,wx.IMAGE_LIST_NORMAL)
#调用InsertImageStringItem(),把字典的内容添加到图标下面
for x in range(5):
self.list.InsertImageStringItem(x,data[x],x)
if __name__=='__main__':
app = wx.App()
frame=MyFrame()
frame.Show()
app.MainLoop()
今天的学习笔记就到这啦~