16 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绑定器会触发处理程序。当列表框项目上出现双击事件时,将调用由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()

上面的代码产生以下输出。玩家的数据显示在报告视图中

Listctrl演示输出