16 wxPython ListBox和ListCtrl类 15 wxPython HTMLWindow类 01 wxPython BoxSizer 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绑定器会触发处理程序。当列表框项目上出现双击事件时,将调用由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小部件的外观由以下样式参数控制 下面给出了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() 上面的代码产生以下输出。玩家的数据显示在报告视图中 15 wxPython HTMLWindow类 01 wxPython BoxSizer