日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

wxpython wx listctrl_wxPython - ListCtrl列表排序

發(fā)布時間:2024/7/23 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wxpython wx listctrl_wxPython - ListCtrl列表排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

13.4.2?如何對列表排序?

在wxPython中有三個有用的方法可以對列表進行排序,在這一節(jié),我們將按照從易到難的順序來討論。

在創(chuàng)建的時候告訴列表去排序

對一個列表控件排序的最容易的方法,是在構(gòu)造函數(shù)中告訴該列表控件對項目進行排序。你可以通過使用樣式標記wx.LC_SORT_ASCENDING或wx.LC_SORT_DESCENDING來實現(xiàn)。這兩個標記導致了列表在初始顯示的時候被排序,并且在Windows上,當新的項目被添加時,依然遵循所樣式標記來排序。對于每個列表項的數(shù)據(jù)的排序,是基于其字符串文本的,只是簡單的對字符串進行比較。如果列表是報告模式的,則排序是基于每行的最左邊的列的字符串的。

基于數(shù)據(jù)而非所顯示的文本來排序

有時,你想根據(jù)其它方面而非列表標簽的字符串來對列表排序。在wxPython中,你可以做到這一點,但這是較為復雜的。首先,你需要為列表中的每個項目設置項目數(shù)據(jù),這通過使用SetItemData(item,?data)方法。參數(shù)item是項目在未排序的列表中的索引,參數(shù)data必須是一個整形或長整形的值(由于C++的數(shù)據(jù)類型的限制),這就有點限制了該機制的作用。如果要獲取某行的項目數(shù)據(jù),可以使用方法GetItemData(item)。

一旦你設置了項目數(shù)據(jù),你就可以使用方法SortItems(func)來排序項目。參數(shù)func是一個可調(diào)用的Python對象(函數(shù)),它需要兩個整數(shù)。func函數(shù)對兩個列表項目的數(shù)據(jù)進行比較——你不能得到行自身的引用。如果第一項比第二項大的話,函數(shù)將返回一個正整數(shù),如果第一項比第二項小的話,返回一個負值,如果相等則返回0。盡管實現(xiàn)這個函數(shù)的最顯而易見的方法是只對這兩個項目做一個數(shù)字的比較就可以了,但是這并不唯一的排序方法。比如,數(shù)據(jù)項可能是外部字典或列表中的一個關(guān)鍵字,與該關(guān)鍵字相應的是一個更復雜的數(shù)據(jù)項,這種情況下,你可以通過比較與該關(guān)鍵字相應的數(shù)據(jù)項來排序。

使用mixin類進行列排序

關(guān)于對一個列表控件進行排序的常見的情況是,讓用戶能夠通過在報告模式的列表的任一列上進行敲擊來根據(jù)該列進行排序。你可以使用SortItems()機制來實現(xiàn),但是它在保持到列的跟蹤方面有點復雜。幸運的是,一個名為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

# 創(chuàng)建數(shù)據(jù)映射

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)# 關(guān)聯(lián)數(shù)據(jù)和映射

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工作,你需要執(zhí)行下面的東西:

1、擴展自ColumnSorterMixin的類(這里是DemoFrame)必須有一個名為GetListCtrl()的方法,它返回實際要被排序的列表控件。該方法被這個mixin用來得到控件的一個索引。 2、在擴展自ColumnSorterMixin的類(這里是DemoFrame)的__init__()方法中,在你調(diào)用ColumnSorterMixin的__init__()方法之前,你必須創(chuàng)建GetListCtrl()所要引用的列表控件。該mixin的__init__()方法要求一個代表列表控件中的列號的整數(shù)值。 3、你必須使用SetItemData()為列表中的每行設置一個唯一的數(shù)據(jù)值。 4、擴展自ColumnSorterMixin的類(這里是DemoFrame)必須有一個名為itemDataMap的屬性。該屬性必須是一個字典。字典中的關(guān)鍵性的東西是由SetItemData()設置的數(shù)據(jù)值。這些值是你想用來對每列進行排序的值的一個元組。(典型情況下,這些值將是每列中的文本)。按句話說,itemDataMap本質(zhì)上是將控件中的數(shù)據(jù)復制成另一種易于排序的形式。 在ColumnSorterMixin的通常用法中,你要么創(chuàng)建itemDataMap用來添加項目到你的列表控件,要么你首先創(chuàng)建itemDataMap,并用它來建造列表控件本身。 盡管配置可能有點復雜,但ColumnSorterMixin對于列的排序是一個不錯的選擇。

總結(jié)

以上是生活随笔為你收集整理的wxpython wx listctrl_wxPython - ListCtrl列表排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。