wxpython wx listctrl_wxPython - ListCtrl列表排序

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对于列的排序是一个不错的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle的知识,oracle的基本知识

OracleSqlServer2000 2005MySqlDB2ORACLE sun SUN数据库 DataBase db存储数据数据 Data数字 符号 字符 信息DBMS 数据库管理系统SQL : 结构化查询语言笔试: scjp sql 20 - 30%Oracle 10g XEOracle 9iSQL:CRUD增删改查DDLDMLDCL: DBA查询数据库中所有的表:select …

linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆

最近,我们想对MongoDB在大量连接中的行为进行基准测试。这使我不得不重新讨论该主题,并刷新关于如何在Linux服务器上创建大量连接和线程的记忆。在此过程中,我发现了一些没有使用过的新可调参数。MongoDB配置甚至MongoDB本身也可以选择限制传…

ui li 菜单 点击添加下级_【Qt开发】实现系统托盘,托盘菜单,托盘消息

概述系统托盘就是在系统桌面底部特定的区域显示运行的程序。windows在任务栏状态区域,linux在布告栏区域。应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能。演示Demo实现功能:1.应用启动后,任…

linux命令date的功能,Linux 命令date

1.命令名称(Command Name):data2.命令作用(Command Function):打印或设置系统日期和时间(print or set the system date and time)3.命令描述(Command Description):显示当前时间在给定的格式,或设置系统日期。( Display the cur…

python组合数据分类_Python解决数据样本类别分布不均衡问题

所谓不平衡指的是:不同类别的样本数量差异非常大。数据规模上可以分为大数据分布不均衡和小数据分布不均衡。大数据分布不均衡:例如拥有1000万条记录的数据集中,其中占比50万条的少数分类样本便于属于这种情况。小数据分布不均衡:…

5g通用模组是什么_中国移动联合芯讯通发布5G终端、芯片及测试产业报告

11月19日,2020中国移动全球合作伙伴大会以“5G融入百业 数智引领未来”为主题在广州召开,从多个维度展现了中国移动运用5G技术驱动各行业转型升级的强大实力。并于21日在展会现场发布了《5G终端、芯片及测试产业报告》。5G终端、芯片及测试产业报告发布现…

dell网卡linux驱动,DELL R710 服务器 Linux 系统网卡驱动安装

DELL R710在装完AS4U7版本的Linux后发现,网卡没有识别出来。怀疑是网卡驱动没有装上,打电话给DELL的工程师,得到的答复是装系统前必须用随机带的引导盘来安装才能将网卡驱动装上。现在系统已经装完了,总不能重装一遍吧&#xff0c…

博客网站源代码_详解SEO布词以及网站排名优化技巧

首先,谈谈新手以及老手在认知上容易出现的SEO误区,我认为有以下几点因素,不容忽视。1、SEO优化就是为了排名、就是发外链不少人认为做SEO就是为了排名,完全不考虑网站文章的质量、可读性以及用户体验,甚至不惜使用一些…

linux编译错误 程序中有游离的,操作系统实验报告 附思考题(24页)-原创力文档...

课程设计(综合实验)报告( 2015 -- 2016 年度第 1 学期)名 称: 操作系统综合实验题 目: oslab 综合实验院 系: 计算机系班 级:学 号:学生姓名:指导教师:设计周数: 分散进行成 绩&…

python合并路径和文件名_Python实例 分割路径和文件名

import os.path# 常用函数有三种:分隔路径,找出文件名.找出盘符(windows系统),找出文件的扩展名.# 根据你机器的实际情况修改下面参数.spath " D:/download/repository.7z "# case 1:p,f os.path.split(spath);print ( " dir is: " p)print ( " …

惠普g260鼠标宏软件_黑爵电竞鼠标AJ337 电竞手残党福音 鼠标宏一键火力全开

2020年,可以说是英特尔最难受的一年,多年来的挤牙膏大法也不灵了,面对AMD更先进的7mm制程以及更多的线程数,加上本身更合理的售价,说实话就连一向占据处理器半壁江山的英特尔也感受到了很高的威胁。AMD撕裂者系列发布以…

linux tcp压测工具,02.监控和压测工具 - 2.4.压测工具 - 《Linux性能调优指南》 - 书栈网 · BookStack...

压测工具其它有用工具在这里,我们会讨论主要的压力测试工具,选择合适的压测工具,才能准确衡量系统性能。好的压测工具有很多,可能的功能如下:发起压力监控性能监控系统使用率生成报告基准测试无非就是看系统能力是否达…

python 动态调整控件大小_python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例...

PyQt5动态(可拖动控件大小)布局控件QSplitter简介PyQt还提供了特殊的布局管理器QSplitter。它可以动态地拖动子控件之间的边界,算是一个动态的布局管理器,QSplitter允许用户拖动子控件的边界控制子控件的大小,并提供一个处理拖曳子控件的控制…

斐讯n1刷linux服务器,斐讯N1刷机Linux(Armbian)

一、降级N1打开ADB链接开始降级。降级后版本号不变二、第三方固件依然是上面的链接(官改v2.2)USB双头线链接HDMI借口最近的USB和电脑的USB进入线刷模式(电视不会显示任何东西,但是电脑会显示设备已连接)。打开上面的刷机工具刷入官改v2.2。理论刷完后重启即可进入安…

python 四足机器人运动学_撸了个四足机器人

纯粹分享一下踩过的坑…… Robot,男人的浪漫~组装完成后,就是这样子了:1 )主控:Raspberry Pi Zero W,1 个对于新手,这是最容易上手的硬件了。软件方面有很好的支持,资料非常丰富。例…

delphi开发LINUX程序,DELPHI开发LINUX包

DELPHI开发LINUX包我们知道,有了包的存在,开发插件架构的程序,才成为可能 。DELPHI在WINDOWS里面的包的扩展名是.bpl。在LINUX里面的包的扩展名是.o。怎样在LINUX里面加载.o的包?不论加载WINDOWS的包,还是加载LINUX的包…

python3多进程写时拷贝_python多进程实现复制文件

[Python] 纯文本查看 复制代码多进程实现复制文件步骤:(1)获得源文件夹路径;(2)获取源文件夹下各文件的文件名(3)获得目标文件夹(4)复制文件(文件夹不能复制)新增内容:复制一个文件夹下的所有文件知识点:(1)os模块:1&g…

在linux cuda安装教程,Ubuntu20.04安装cuda10.1的步骤(图文教程)

安装前准备cuda的主要用途是深度学习,而目前主流的深度学习框架tensorflow2最高支持cuda 10.1,因此本文讲解在ubuntu 20.04系统上安装cuda 10.1的主要过程。首先要查看你的nvidia显卡驱动是否支持cuda10.1版本。在终端执行以下命令:nvidia-sm…

9050 端口 linux 进程,Linux中查看某个端口占用情况

Bridge模式——对象结构型模式今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...如何在终端实时展现git分支在微博上看到ghosTM…

代码重构的方法和经验_关于烂代码优化重构的几点经验

是否已经读过前面两篇关于烂代码和好代码的文章?这些让人抓狂的烂代码,你碰到几种?什么才是好代码、高质量代码?工作中,总会不可避免的接触到烂代码,就像之前说的,几乎没有程序员可以完全避免写…