wxPython ListBox和ListCtrl类
wx.ListBox小部件呈现可垂直滚动的字符串列表。默认情况下,列表中的单个项目是可选的。但是,它可以自定义为多选。
ListCtrl小部件是一个高度增强的列表显示和选择工具。可以在“报表”视图,“列表”视图或“图标”视图中显示多个列的列表。
ListBox构造函数具有以下定义
Wx.ListBox(parent, id, pos, size, choices, style)
Choices参数是用于填充列表的字符串列表。
wx.ListBox对象可以使用以下样式参数进行自定义:
序号 | 参数和描述 |
---|---|
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类方法:
序号 | 方法和描述 |
---|---|
1 |
DeSelect( ) 取消选择列表框中的项目 |
2 |
InsertItem() 在指定位置插入给定的字符串 |
3 |
SetFirstItem() 将给定索引处的字符串设置为列表中的第一个字符串 |
4 |
IsSorted() 如果使用wxzL?B_SORT样式,则返回true |
5 |
GetString() 返回所选索引处的字符串 |
6 |
SetString() 设置给定索引处项目的标签 |
当选择列表中的项目或选择以编程方式更改时,EVT_LISTBOX绑定器会触发处理程序。当列表框项目上出现双击事件时,将调用由EVT_LISTBOX_DCLICK绑定的处理程序函数。
范例
在下面的示例中,ListBox控件和TextCtrl对象分别放置在水平框大小调整器的左侧和右侧部分。ListBox在languages [] list对象中填充了字符串。
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 = 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
小部件的外观由以下样式参数控制:
序号 | 参数和描述 |
---|---|
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()
上面的代码产生以下输出。玩家的数据显示在报告视图:
下一章:wxPython BoxSizer
该分级器允许控件以行方式或列方式排列。 BoxSizer 布局由其方向参数(wxVERTICAL或wxHORIZONTAL)决定。Box = wx.BoxSizer(wxHORIZONTAL)Box = ...