13.4.2 如何对列表排序?

在wxPython中有三个有用的方法可以对列表进行排序,在这一节,我们将按照从易到难的顺序来讨论。

在创建的时候告诉列表去排序

对一个列表控件排序的最容易的方法,是在构造函数中告诉该列表控件对项目进行排序。你可以通过使用样式标记wx.LC_SORT_ASCENDING或wx.LC_SORT_DESCENDING来实现。这两个标记导致了列表在初始显示的时候被排序,并且在Windows上,当新的项目被添加时,依然遵循所样式标记来排序。对于每个列表项的数据的排序,是基于其字符串文本的,只是简单的对字符串进行比较。如果列表是报告模式的,则排序是基于每行的最左边的列的字符串的。

基于数据而非所显示的文本来排序

有时,你想根据其它方面而非列表标签的字符串来对列表排序。在wxPython中,你可以做到这一点,但这是较为复杂的。首先,你需要为列表中的每个项目设置项目数据,这通过使用SetItemData(item, data)方法。参数item是项目在未排序的列表中的索引,参数data必须是一个整形或长整形的值(由于C++的数据类型的限制),这就有点限制了该机制的作用。如果要获取某行的项目数据,可以使用方法GetItemData(item)。

一旦你设置了项目数据,你就可以使用方法SortItems(func)来排序项目。参数func是一个可调用的Python对象(函数),它需要两个整数。func函数对两个列表项目的数据进行比较——你不能得到行自身的引用。如果第一项比第二项大的话,函数将返回一个正整数,如果第一项比第二项小的话,返回一个负值,如果相等则返回0。尽管实现这个函数的最显而易见的方法是只对这两个项目做一个数字的比较就可以了,但是这并不唯一的排序方法。比如,数据项可能是外部字典或列表中的一个关键字,与该关键字相应的是一个更复杂的数据项,这种情况下,你可以通过比较与该关键字相应的数据项来排序。

使用mixin类进行列排序

关于对一个列表控件进行排序的常见的情况是,让用户能够通过在报告模式的列表的任一列上进行敲击来根据该列进行排序。你可以使用SortItems()机制来实现,但是它在保持到列的跟踪方面有点复杂。幸运的是,一个名为ColumnSorterMixin的wxPython的mixin类可以为你处理这些信息,它位于wx.lib.mixins.listctrl模块中。图13.5显示了使用该mixin类对列进行的排序。

声明这个mixin就和Python中声明任何其它的多重继承一样,如下所示:

import wx.lib.mixins.listctrl as listmix

class ListCtrlPanel(wx.Panel, listmix.ColumnSorterMixin):

def __init__(self, parent, log):

wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)

self.list = TestListCtrl(self, tID)

self.itemDataMap = musicdata

listmix.ColumnSorterMixin.__init__(self, 3)

例13.4是图13.5的例子代码

例13.4 使用mixin对一个报告列表进行排序

#!/usr/bin/python

#-*- encoding:UTF-8 -*-

import wx

import wx.lib.mixins.listctrl

import sys, glob, random

import data

class DemoFrame(wx.Frame, wx.lib.mixins.listctrl.ColumnSorterMixin):#多重继承

def __init__(self):

wx.Frame.__init__(self, None, -1,

"wx.ListCtrl with ColumnSorterMixin",

size=(600,400))

# load some images into an image list

il = wx.ImageList(16,16, True)

for name in glob.glob("smicon??.png"):

bmp = wx.Bitmap(name, wx.BITMAP_TYPE_PNG)

il_max = il.Add(bmp)

# add some arrows for the column sorter

# 添加箭头到图像列表

self.up = il.AddWithColourMask(

wx.Bitmap("sm_up.bmp", wx.BITMAP_TYPE_BMP), "blue")

self.dn = il.AddWithColourMask(

wx.Bitmap("sm_down.bmp", wx.BITMAP_TYPE_BMP), "blue")

# create the list control

self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)

# assign the image list to it

self.list.AssignImageList(il, wx.IMAGE_LIST_SMALL)

# Add some columns

for col, text in enumerate(data.columns):

self.list.InsertColumn(col, text)

# add the rows

# 创建数据映射

self.itemDataMap = {}

for item in data.rows:

index = self.list.InsertStringItem(sys.maxint, item[0])

for col, text in enumerate(item[1:]):

self.list.SetStringItem(index, col+1, text)

# give each item a data value, and map it back to the

# item values, for the column sorter

self.list.SetItemData(index, index)# 关联数据和映射

self.itemDataMap[index] = item

# give each item a random image

img = random.randint(0, il_max)

self.list.SetItemImage(index, img, img)

# set the width of the columns in various ways

self.list.SetColumnWidth(0, 120)

self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)

self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE)

self.list.SetColumnWidth(3, wx.LIST_AUTOSIZE_USEHEADER)

# initialize the column sorter

wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self,

len(data.columns))

def GetListCtrl(self):

return self.list

def GetSortImages(self):

return (self.dn, self.up)

app = wx.PySimpleApp()

frame = DemoFrame()

frame.Show()

app.MainLoop()

为了使用该mixin工作,你需要执行下面的东西:

1、扩展自ColumnSorterMixin的类(这里是DemoFrame)必须有一个名为GetListCtrl()的方法,它返回实际要被排序的列表控件。该方法被这个mixin用来得到控件的一个索引。 2、在扩展自ColumnSorterMixin的类(这里是DemoFrame)的__init__()方法中,在你调用ColumnSorterMixin的__init__()方法之前,你必须创建GetListCtrl()所要引用的列表控件。该mixin的__init__()方法要求一个代表列表控件中的列号的整数值。 3、你必须使用SetItemData()为列表中的每行设置一个唯一的数据值。 4、扩展自ColumnSorterMixin的类(这里是DemoFrame)必须有一个名为itemDataMap的属性。该属性必须是一个字典。字典中的关键性的东西是由SetItemData()设置的数据值。这些值是你想用来对每列进行排序的值的一个元组。(典型情况下,这些值将是每列中的文本)。按句话说,itemDataMap本质上是将控件中的数据复制成另一种易于排序的形式。 在ColumnSorterMixin的通常用法中,你要么创建itemDataMap用来添加项目到你的列表控件,要么你首先创建itemDataMap,并用它来建造列表控件本身。 尽管配置可能有点复杂,但ColumnSorterMixin对于列的排序是一个不错的选择。

wxpython wx listctrl_wxPython - ListCtrl列表排序相关推荐

  1. wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例

    本文实例讲述了Python wxPython库使用wx.ListBox创建列表框.分享给大家供大家参考,具体如下: 如何创建一个列表框? 列表框是提供给用户选择的另一机制.选项被放置在一个矩形的窗口中 ...

  2. Python学习教程实用技法:通过公共键对字典列表排序—itemgetter

    Python学习教程实用技法:通过公共键对字典列表排序-itemgetter 前言:我们有一个字典列表,想根据一个或多个字典中的值对列表进行排序. 利用operator模块中的itemgetter函数 ...

  3. 利用jQuery对无序列表排序 http://www.apkbus.com/android-80639-1-1.html

    利用jQuery对无序列表排序的原理是:获取到无序列表中的所有列表项,并转成数组形式,使用JavaScript函数对其进行排序后再次输出.其中使用到的jQuery函数有ready().get().te ...

  4. python 3 字典排序_Python学习教程实用技法:通过公共键对字典列表排序—itemgetter...

    Python学习教程实用技法:通过公共键对字典列表排序-itemgetter 前言:我们有一个字典列表,想根据一个或多个字典中的值对列表进行排序. 利用operator模块中的itemgetter函数 ...

  5. Python列表排序 reverse、sort、sorted 操作方法详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级python list排序中,后两中方法还可以加入条件参数进行排序. ...

  6. Python 列表排序方法reverse、sort、sorted详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

  7. python 字符串比较忽略大小写的方法_python实现忽略大小写对字符串列表排序的方法...

    本文实例讲述了python实现忽略大小写对字符串列表排序的方法,是非常实用的技巧.分享给大家供大家参考.具体分析如下: 先来看看如下代码: string = ''' the stirng Has ma ...

  8. python删除链表中的最小元素_LintCode Python 入门级题目 删除链表元素、整数列表排序...

    删除链表元素: 循环列表head,判断当前指针pre.next的val是否等于val, 如果是,当前pre重指向pre.next.next, 直至pre.next = Null # Definitio ...

  9. [转载] Python列表排序 list.sort方法和内置函数sorted

    参考链接: Python中的函数 Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时 ...

最新文章

  1. 我给这个Python库打101分!
  2. 禁止复制粘贴_网页禁止复制粘贴? 教你5招, 绕过网页限制, 免费复制全网内容!...
  3. 解决Linux里面未启用网卡的问题
  4. VUE2.0增删改查附编辑添加model(弹框)组件共用
  5. java反射优化_JAVA反射优化
  6. MySQL用sql复制表数据到新表的方法
  7. eucalyptus 云平台搭建
  8. chrome浏览器截长图
  9. python操作QQ
  10. css3循环播放属性,详细介绍CSS3中animation-direction属性
  11. 支付网关 | 京东618、双11用户支付的核心承载系统上篇
  12. PS去除图片白色背景
  13. 信息安全常见名词解释
  14. TCGA临床数据整理
  15. linux迅雷命令行,Linux系统下使用wine运行迅雷5的方法
  16. 华为云下docker安装svn
  17. 怎么评估计算机的执行速度,Win10在CMD下使用WinSAT进行评估电脑性能解决方法
  18. 拒酒词――――――社交必备
  19. 实现权重抽奖算法(java)
  20. Redis 高级 Java 客户端 Lettuce 的用法及踩坑经验

热门文章

  1. 笔记:猎头如何在一周之内“摸清”一个行业
  2. 关于dev无法更新、调试的问题
  3. 51 Nod 1116 K进制下的大数
  4. 嵌入式系统之操作系统篇
  5. Redis学习笔记之Redis的对象
  6. oracle数据库启动
  7. 简单实现UITableView索引功能(中英文首字母索引)(一) ByH罗
  8. java日期处理总结
  9. 【转】android Notification 的使用
  10. linux基础知识——exec函数