wxPython - ListBox & ListCtrl 类
一个 wx.ListBox 小部件呈现一个垂直滚动的字符串列表。 默认情况下,列表中的单个项目是可选择的。 但是,它可以自定义为多选。
ListCtrl 小部件是高度增强的列表显示和选择工具。 可以在报表视图、列表视图或图标视图中显示多列列表。
ListBox 的构造函数定义如下 −
Wx.ListBox(parent, id, pos, size, choices, style)
Choices 参数是用于填充列表的字符串列表。
wx.ListBox 对象可以使用以下样式参数进行自定义 −
S.N. | 参数 & 说明 |
---|---|
1 | wxLB_SINGLE 单选列表 |
2 | wxLB_MULTIPLE 多选列表:用户可以打开和关闭多个项目 |
3 | wxLB_EXTENDED 扩展选择列表 − 用户可以通过使用 SHIFT 或 CTRL 键以及光标移动键或鼠标来扩展选择 |
4 | wxLB_HSCROLL 如果内容太宽,创建水平滚动条 |
5 | wxLB_ALWAYS_SB 始终显示垂直滚动条 |
6 | wxLB_NEEDED_SB 仅在需要时创建垂直滚动条 |
7 | wxLB_SORT 列表框内容按字母顺序排列 |
wx.ListBox 类方法 −
S.N. | 方法与说明 |
---|---|
1 | DeSelect() 取消选择列表框中的项目 |
2 | InsertItem() 在指定位置插入给定的字符串 |
3 | SetFirstItem() 将给定索引处的字符串设置为列表中的第一个 |
4 | IsSorted() 如果使用 wxzL?B_SORT 样式则返回真 |
5 | GetString() 返回所选索引处的字符串 |
6 | SetString() 为给定索引处的项目设置标签 |
EVT_LISTBOX 活页夹在选择列表中的项目或选择以编程方式更改时触发处理程序。 EVT_LISTBOX_DCLICK 绑定的处理函数在列表框项目上发生双击事件时被调用。
示例
在下面的示例中,一个 ListBox 控件和一个 TextCtrl 对象分别放置在水平框大小调整器的左侧和右侧。 ListBox 由 languages[] 列表对象中的字符串填充。
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript','PHP','VB.NET','C#'] self.text = wx.TextCtrl(panel,style = wx.TE_MULTILINE) lst = wx.ListBox(panel, size = (100,-1), choices = languages, style = wx.LB_SINGLE)
两个对象被放置在一个水平的 box sizer 中。
box = wx.BoxSizer(wx.HORIZONTAL) box.Add(lst,0,wx.EXPAND) box.Add(self.text, 1, wx.EXPAND)
ListBox 控件链接到带有 EVT_LISTBOX 绑定器的 onListBox() 处理程序。
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)
处理程序将选定的字符串附加到右侧的多行 TextCtrl 中。
def onListBox(self, event): self.text.AppendText( "Current selection: "+ event.GetEventObject().GetStringSelection() + "\n")
完整代码如下所示 −
import wx class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title,size = (350,300)) panel = wx.Panel(self) box = wx.BoxSizer(wx.HORIZONTAL) self.text = wx.TextCtrl(panel,style = wx.TE_MULTILINE) languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#'] lst = wx.ListBox(panel, size = (100,-1), choices = languages, style = wx.LB_SINGLE) box.Add(lst,0,wx.EXPAND) box.Add(self.text, 1, wx.EXPAND) panel.SetSizer(box) panel.Fit() self.Centre() self.Bind(wx.EVT_LISTBOX, self.onListBox, lst) self.Show(True) def onListBox(self, event): self.text.AppendText( "Current selection: "+event.GetEventObject().GetStringSelection()+"\n") ex = wx.App() Mywin(None,'ListBox Demo') ex.MainLoop()
以上代码产生如下输出 −
wx.ListCtrl 是一个增强的,因此也是更复杂的小部件。 ListBox 只显示一列,而 ListCtrl 可以包含多列。 ListCtrl 小部件的外观由以下样式参数控制 −
S.N. | 参数 & 说明 |
---|---|
1 | wx.LC_LIST 多列列表视图,带有可选的小图标。 列是自动计算的 |
2 | wx.LC_REPORT 单列或多列报告视图,带有可选标题 |
3 | wx.LC_VIRTUAL 应用程序按需提供项目文本。 只能与 wxLC_REPORT 一起使用 |
4 | wx.LC_ICON 大图标视图,带有可选标签 |
5 | wx.LC_SMALL_ICON 小图标视图,带有可选标签 |
6 | wx.LC_ALIGN_LEFT 图标左对齐 |
7 | wx.LC_EDIT_LABELS 标签是可编辑的 − 开始编辑时通知应用 |
8 | wx.LC_NO_HEADER 报告模式下没有标题 |
9 | wx.LC_SORT_ASCENDING 升序排列 |
10 | wx.LC_SORT_DESCENDING 降序排列 |
11 | wx.LC_HRULES 在报告模式下在行之间绘制浅色水平规则 |
12 | wx.LC_VRULES 在报告模式下在列之间绘制浅色垂直规则 |
示例
在以下示例中构建了报表视图中的 ListCtrl 小部件。
self.list = wx.ListCtrl(panel, -1, style = wx.LC_REPORT)
标题列由 InsertColumn() 方法创建,该方法采用列号、标题、样式和宽度参数。
self.list.InsertColumn(0, 'name', width = 100) self.list.InsertColumn(1, 'runs', wx.LIST_FORMAT_RIGHT, 100) self.list.InsertColumn(2, 'wkts', wx.LIST_FORMAT_RIGHT, 100)
元组列表,每个元组包含三个字符串,称为 players[],用于存储用于填充 ListCtrl 对象的列的数据。
新行以 InsertStringItem() 方法开始,该方法返回当前行的索引。 使用 sys.maxint 给出最后一行之后的行号。 使用索引,其他列由 SetStringItem() 方法填充。
for i in players: index = self.list.InsertStringItem(sys.maxint, i[0]) self.list.SetStringItem(index, 1, i[1]) self.list.SetStringItem(index, 2, i[2])
示例的完整代码是 −
import sys import wx players = [('Tendulkar', '15000', '100'), ('Dravid', '14000', '1'), ('Kumble', '1000', '700'), ('KapilDev', '5000', '400'), ('Ganguly', '8000', '50')] class Mywin(wx.Frame): def __init__(self, parent, title): super(Mywin, self).__init__(parent, title = title) panel = wx.Panel(self) box = wx.BoxSizer(wx.HORIZONTAL) self.list = wx.ListCtrl(panel, -1, style = wx.LC_REPORT) self.list.InsertColumn(0, 'name', width = 100) self.list.InsertColumn(1, 'runs', wx.LIST_FORMAT_RIGHT, 100) self.list.InsertColumn(2, 'wkts', wx.LIST_FORMAT_RIGHT, 100) for i in players: index = self.list.InsertStringItem(sys.maxint, i[0]) self.list.SetStringItem(index, 1, i[1]) self.list.SetStringItem(index, 2, i[2]) box.Add(self.list,1,wx.EXPAND) panel.SetSizer(box) panel.Fit() self.Centre() self.Show(True) ex = wx.App() Mywin(None,'ListCtrl Demo') ex.MainLoop()
以上代码产生以下输出。 −