wx.ListCtrl 组件
wx.ListCtrl是一个项目列表的图形表示。一个wx.ListBox只能有一列,而wx.ListCtrl可以有多于一列。例如,一个文件管理器使用wx.ListCtrl来显示文件系统中的目录和文件。一个CD刻录程序在wx.ListCtrl中显示要刻录的文件。
一个wx.ListCtrl可以以三种不同的样式使用。列表视图、报告视图或图标视图。这些样式由wx.ListCtrl窗口样式控制,wx.LC_REPORT、wx.LC_LIST和wx.LC_ICON。
wx.ListCtrl 样式
wx.LC_LIST
wx.LC_REPORT
wx.LC_VIRTUAL
wx.LC_ICON
wx.LC_SMALL_ICON
wx.LC_ALIGN_LEFT
wx.LC_EDIT_LABELS
wx.LC_NO_HEADER
wx.LC_SORT_ASCENDING
wx.LC_SORT_DESCENDING
wx.LC_HRULES
wx.LC_VRULES
wx.ListCtrl 例子
#listctrl_exam.py
importwx
data= [('Jessica Alba', 'Pomona', '1981'), ('Sigourney Weaver', 'New York', '1949'),
('Angelina Jolie', 'los angeles', '1975'), ('Natalie Portman', 'Jerusalem', '1981'),
('Rachel Weiss', 'London', '1971'), ('Scarlett Johansson', 'New York', '1984')]classExample(wx.Frame):def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()defInitUI(self):
hbox=wx.BoxSizer(wx.HORIZONTAL)
panel=wx.Panel(self)
self.list= wx.ListCtrl(panel, wx.ID_ANY, style=wx.LC_REPORT)
self.list.InsertColumn(0,'name', width=140)
self.list.InsertColumn(1, 'place', width=130)
self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)
idx=0for i indata:
index=self.list.InsertItem(idx, i[0])
self.list.SetItem(index,1, i[1])
self.list.SetItem(index,2, i[2])
idx+= 1hbox.Add(self.list,1, wx.EXPAND)
panel.SetSizer(hbox)
self.SetTitle('Actresses')
self.Centre()defmain():
app=wx.App()
ex=Example(None)
ex.Show()
app.MainLoop()if __name__ == '__main__':
main()
该代码示例在wx.ListCtrl中显示有关女演员的数据。
self.list = wx.ListCtrl(panel, wx.ID_ANY, style=wx.LC_REPORT)
我们创建一个具有wx.LC_REPORT风格的wx.ListCtrl。
self.list.InsertColumn(0, 'name', width=140)
self.list.InsertColumn(1, 'place', width=130)
self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)
我们插入三列。我们可以指定列的宽度和列的格式。默认的格式是wx.LIST_FORMAT_LEFT。
idx =0for i indata:
index=self.list.InsertItem(idx, i[0])
self.list.SetItem(index,1, i[1])
self.list.SetItem(index,2, i[2])
idx+= 1
我们使用两个方法将数据插入到wx.ListCtrl中。每一行都以InsertItem()方法开始。该方法的第一个参数指定了行号。该方法返回行的索引。SetItem()方法将数据添加到当前行的连续列中。
Mixins
Mixins是进一步增强wx.ListCtrl功能的类。它们位于wx.lib.mixins.listctrl模块中。为了使用它们,我们必须继承这些类的功能。
有六个 mixins。
wx.ColumnSorterMixin
wx.ListCtrlAutoWidthMixin
wx.ListCtrlSelectionManagerMix
wx.TextEditMixin
wx.CheckListCtrlMixin
wx.ListRowHighlighter
wx.ColumnSorterMixin是一个能够在报表视图中对列进行排序的mixin。
wx.ListCtrlAutoWidthMixin类可以自动调整最后一列的大小到wx.ListCtrl的末端。默认情况下,最后一列不占用剩余空间。请看前面的例子。
wx.ListCtrlSelectionManagerMix定义了独立于平台的选择策略。
wx.TextEditMixin可以编辑文本。wx.CheckListCtrlMixin为每一行添加一个复选框。这样我们就可以控制行。我们可以将每一行设置为选中或不选中。
wx.ListRowHighlighter处理wx.ListCtrl中交替行的自动背景高亮。
wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin
下面的代码显示了我们如何使用 wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin
#autowidth.py
importwximportwx.lib.mixins.listctrl
data= [('Jessica Alba', 'Pomona', '1981'), ('Sigourney Weaver', 'New York', '1949'),
('Angelina Jolie', 'Los Angeles', '1975'), ('Natalie Portman', 'Jerusalem', '1981'),
('Rachel Weiss', 'London', '1971'), ('Scarlett Johansson', 'New York', '1984')]classAutoWidthListCtrl(wx.ListCtrl, wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin):def __init__(self, parent, *args, **kw):
wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin.__init__(self)classExample(wx.Frame):def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()defInitUI(self):
hbox=wx.BoxSizer(wx.HORIZONTAL)
panel=wx.Panel(self)
self.list=AutoWidthListCtrl(panel)
self.list.InsertColumn(0,'name', width=140)
self.list.InsertColumn(1, 'place', width=130)
self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)
idx=0for i indata:
index=self.list.InsertItem(idx, i[0])
self.list.SetItem(index,1, i[1])
self.list.SetItem(index,2, i[2])
idx+= 1hbox.Add(self.list,1, wx.EXPAND)
panel.SetSizer(hbox)
self.SetTitle('Actresses')
self.Centre()defmain():
app=wx.App()
ex=Example(None)
ex.Show()
app.MainLoop()if __name__ == '__main__':
main()
我们把前面的例子改一下。
import wx.lib.mixins.listctrl
这里我们导入 mixin 模块。
class AutoWidthListCtrl(wx.ListCtrl, wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin):
def __init__(self, parent, *args, **kw):
wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin.__init__(self)
我们创建一个新的AutoWidthListCtrl类。这个类继承自wx.ListCtrl和wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin。这就是所谓的多继承。最后一列会自动调整大小以占用wx.ListCtrl的剩余宽度。
wx.lib.mixins.listctrl.ColumnSorterMixin
下面的例子创建了可排序的列。如果我们点击列头,列中相应的行就会被排序。
#sorted.py
importwximportwx.lib.mixins.listctrl
actresses={1 : ('Jessica Alba', 'Pomona', '1981'),2 : ('Sigourney Weaver', 'New York', '1949'),3 : ('Angelina Jolie', 'Los Angeles', '1975'),4 : ('Natalie Portman', 'Jerusalem', '1981'),5 : ('Rachel Weiss', 'London', '1971'),6 : ('Scarlett Johansson', 'New York', '1984')
}classSortedListCtrl(wx.ListCtrl, wx.lib.mixins.listctrl.ColumnSorterMixin):def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self, len(actresses))
self.itemDataMap=actressesdefGetListCtrl(self):returnselfclassExample(wx.Frame):def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()defInitUI(self):
hbox=wx.BoxSizer(wx.HORIZONTAL)
panel=wx.Panel(self)
self.list=SortedListCtrl(panel)
self.list.InsertColumn(0,'name', width=140)
self.list.InsertColumn(1, 'place', width=130)
self.list.InsertColumn(2, 'year', wx.LIST_FORMAT_RIGHT, 90)
items=actresses.items()
idx=0for key, data initems:
index=self.list.InsertItem(idx, data[0])
self.list.SetItem(index,1, data[1])
self.list.SetItem(index,2, data[2])
self.list.SetItemData(index, key)
idx+= 1hbox.Add(self.list,1, wx.EXPAND)
panel.SetSizer(hbox)
self.SetTitle('Actresses')
self.Centre()defmain():
app=wx.App()
ex=Example(None)
ex.Show()
app.MainLoop()if __name__ == '__main__':
main()
我们再以女演员为例。
wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self, len(actresses))
wx.lib.mixins.listctrl.ColumnSorterMixin接受一个参数:要排序的列数。
self.itemDataMap = actresses
我们必须将我们要显示在列表控件中的数据映射到itemDataMap属性中。数据必须是一个字典数据类型。
def GetListCtrl(self):
return self
我们必须创建一个GetListCtrl()方法。这个方法返回要排序的wx.ListCtrl部件。
self.list.SetItemData(index, key)
我们必须为每一行分配一个特殊的索引。这是通过SetItemData方法完成的。
wx.lib.mixins.listctrl.CheckListCtrl
列表控件中可以放置一个复选框。在wxPython中,我们可以使用wx.lib. mixins.listctrl.CheckListCtrl。
#repository.py
importwxfrom wx.lib.mixins.listctrl importCheckListCtrlMixin, ListCtrlAutoWidthMixin
packages= [('abiword', '5.8M', 'base'), ('adie', '145k', 'base'),
('airsnort', '71k', 'base'), ('ara', '717k', 'base'), ('arc', '139k', 'base'),
('asc', '5.8M', 'base'), ('ascii', '74k', 'base'), ('ash', '74k', 'base')]classCheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT |wx.SUNKEN_BORDER)
CheckListCtrlMixin.__init__(self)
ListCtrlAutoWidthMixin.__init__(self)classExample(wx.Frame):def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
panel=wx.Panel(self)
vbox=wx.BoxSizer(wx.VERTICAL)
hbox=wx.BoxSizer(wx.HORIZONTAL)
leftPanel=wx.Panel(panel)
rightPanel=wx.Panel(panel)
self.log= wx.TextCtrl(rightPanel, style=wx.TE_MULTILINE|wx.TE_READONLY)
self.list=CheckListCtrl(rightPanel)
self.list.InsertColumn(0,'Package', width=140)
self.list.InsertColumn(1, 'Size')
self.list.InsertColumn(2, 'Repository')
idx=0for i inpackages:
index=self.list.InsertItem(idx, i[0])
self.list.SetItem(index,1, i[1])
self.list.SetItem(index,2, i[2])
idx+= 1vbox2=wx.BoxSizer(wx.VERTICAL)
selBtn= wx.Button(leftPanel, label='Select All')
desBtn= wx.Button(leftPanel, label='Deselect All')
appBtn= wx.Button(leftPanel, label='Apply')
self.Bind(wx.EVT_BUTTON, self.OnSelectAll, id=selBtn.GetId())
self.Bind(wx.EVT_BUTTON, self.OnDeselectAll, id=desBtn.GetId())
self.Bind(wx.EVT_BUTTON, self.OnApply, id=appBtn.GetId())
vbox2.Add(selBtn, 0, wx.TOP|wx.BOTTOM, 5)
vbox2.Add(desBtn, 0, wx.BOTTOM,5)
vbox2.Add(appBtn)
leftPanel.SetSizer(vbox2)
vbox.Add(self.list,4, wx.EXPAND | wx.TOP, 3)
vbox.Add((-1, 10))
vbox.Add(self.log,1, wx.EXPAND)
vbox.Add((-1, 10))
rightPanel.SetSizer(vbox)
hbox.Add(leftPanel, 0, wx.EXPAND| wx.RIGHT, 5)
hbox.Add(rightPanel,1, wx.EXPAND)
hbox.Add((3, -1))
panel.SetSizer(hbox)
self.SetTitle('Repository')
self.Centre()defOnSelectAll(self, event):
num=self.list.GetItemCount()for i inrange(num):
self.list.CheckItem(i)defOnDeselectAll(self, event):
num=self.list.GetItemCount()for i inrange(num):
self.list.CheckItem(i, False)defOnApply(self, event):
num=self.list.GetItemCount()for i inrange(num):if i ==0: self.log.Clear()ifself.list.IsChecked(i):
self.log.AppendText(self.list.GetItemText(i)+ '\n')defmain():
app=wx.App()
ex=Example(None)
ex.Show()
app.MainLoop()if __name__ == '__main__':
main()
这个例子用wx.lib.mixins.listctrl.CheckListCtrl创建了一个版本库UI。
class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT |
wx.SUNKEN_BORDER)
CheckListCtrlMixin.__init__(self)
ListCtrlAutoWidthMixin.__init__(self)
我们从三个不同的类中继承。
def OnSelectAll(self, event):
num = self.list.GetItemCount()
for i in range(num):
self.list.CheckItem(i)
OnSelectAll()方法选择所有的复选框。GetItemCount()确定项数,CheckItem()方法标记当前复选框。
转载:https://zhuanlan.zhihu.com/p/270279041
本文详细介绍了wxPython中的wx.ListCtrl组件,它是一个多功能的列表控件,支持多列显示。文章通过示例展示了如何创建不同样式的ListCtrl,如报告视图、列表视图和图标视图,并使用wx.lib.mixins.listctrl中的Mixins增强功能,如自动宽度调整、列排序和复选框。示例代码包括插入数据、设置列宽和格式,以及使用ColumnSorterMixin实现列排序和CheckListCtrlMixin实现复选框功能。
7527

被折叠的 条评论
为什么被折叠?



