wxPython - ListBox & ListCtrl 类

一个 wx.ListBox 小部件呈现一个垂直滚动的字符串列表。 默认情况下,列表中的单个项目是可选择的。 但是,它可以自定义为多选。

ListCtrl 小部件是高度增强的列表显示和选择工具。 可以在报表视图、列表视图或图标视图中显示多列列表。

ListBox 的构造函数定义如下 −

Wx.ListBox(parent, id, pos, size, choices, style)

Choices 参数是用于填充列表的字符串列表。

wx.ListBox 对象可以使用以下样式参数进行自定义 −

S.N. 参数 & 说明
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 类方法 −

S.N. 方法与说明
1

DeSelect()

取消选择列表框中的项目

2

InsertItem()

在指定位置插入给定的字符串

3

SetFirstItem()

将给定索引处的字符串设置为列表中的第一个

4

IsSorted()

如果使用 wxzL?B_SORT 样式则返回真

5

GetString()

返回所选索引处的字符串

6

SetString()

为给定索引处的项目设置标签

EVT_LISTBOX 活页夹在选择列表中的项目或选择以编程方式更改时触发处理程序。 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 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()

以上代码产生如下输出 −

Listbox Demo

wx.ListCtrl 是一个增强的,因此也是更复杂的小部件。 ListBox 只显示一列,而 ListCtrl 可以包含多列。 ListCtrl 小部件的外观由以下样式参数控制 −

S.N. 参数 & 说明
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 演示输出

❮ wxPython 主要类