wxPython ListBox & ListCtrl 类
wx.ListBox小部件呈现一个可垂直滚动的字符串列表。默认情况下,列表中的单个项目是可选择的。但是,它可以自定义为多选。
ListCtrl小部件是一个高度增强的列表显示和选择工具。可以在报表视图、列表视图或图标视图中显示多列列表。
ListBox的构造函数具有以下定义−
Wx.ListBox(parent, id, pos, size, choices, style)
Choices参数是用于填充列表的字符串列表。
wx.ListBox对象可以使用以下样式参数进行定制:
以下是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类方法-
以下是wx.ListBox最常用的方法:
序号 | 方法及说明 |
---|---|
1 | DeSelect() 取消选择列表框中的项目 |
2 | InsertItem() 在指定的位置插入给定的字符 |
3 | SetFirstItem() 将给定索引处的字符串设置为列表中的第一个 |
4 | IsSorted() 如果使用了wxzL?B_SORT样式,则返回true |
5 | GetString() 返回选定索引处的字符串 |
6 | SetString() 设置给定索引处项目的标签 |
EVT_LISTBOX绑定器在列表中选择项或程序atically更改选择时触发处理程序。当发生对列表框项的双击事件时,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 = 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)
处理程序将选定的字符串追加到右侧的多行文本控件中。
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小部件的外观由以下样式参数控制−
下面是Wx.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()
以上代码生成以下输出。玩家的数据以报告视图显示 –