高级列表控件

这次学习了高级列表控件的创建、排序和带位图的列表。

一、高级列表控件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()

今天的学习笔记就到这啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值