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 样式,则返回 true5 GetString()返回所选索引处的字符串6 SetString()为给定索引处的项目设置标签EVT_LISTBOX BINDER在选择列表中的项目或编程时更改时的项目时触发处理程序。由 EVT_LISTBOX_DCLICK 绑定的处理函数在列表框项上发生双击事件时被调用。 -
例子
在下面的例子中,一个 ListBox 控件和一个 TextCtrl 对象分别被放置在一个水平框尺寸器的左右部分。ListBox 用语言[] 列表对象中的字符串填充。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 小部件的外观由以下样式参数控制 -序列号 参数及说明 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)
一个元组列表,每个包含三个字符串,称为 player[] 存储用于填充 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()
上面的代码产生以下输出。玩家的数据显示在报告视图中 -