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 样式,则返回 true
    5
    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()
    
    上面的代码产生以下输出。玩家的数据显示在报告视图中 -
    Listctrl 演示输出