wxPython - ListBox & ListCtrl Class

A wx.ListBox widget presents a vertically scrollable list of strings. By default, a single item in the list is selectable. However, it can be customized to be multi-select.
ListCtrl widget is a highly enhanced list display and selection tool. List of more than one column can be displayed in Report view, List view or Icon view.
ListBox constructor has the following definition −
Wx.ListBox(parent, id, pos, size, choices, style)

Choices parameter is the list of strings used to populate the list.
wx.ListBox object is customizable with the following style parameters −
wxLB_SINGLE
Single-selection list
wxLB_MULTIPLE
Multiple-selection list: the user can toggle multiple items on and off
wxLB_EXTENDED
Extended-selection list − the user can extend the selection by using SHIFT or CTRL keys together with the cursor movement keys or the mouse
wxLB_HSCROLL
Create horizontal scrollbar if contents are too wide
wxLB_ALWAYS_SB
Always show a vertical scrollbar
wxLB_NEEDED_SB
Only creates a vertical scrollbar if needed
wxLB_SORT
The listbox contents are sorted in an alphabetical order
wx.ListBox class methods −
DeSelect()
Deselects an item in the list box
InsertItem()
Inserts a given string at the specified position
SetFirstItem()
Sets a string at the given index as first in the list
IsSorted()
Returns true if wxzL?B_SORT style is used
GetString()
Returns the string at the selected index
SetString()
Sets the label for an item at the given index
EVT_LISTBOX binder triggers the handler when an item in the list is selected or when the selection changes programmatically. Handler function bound by EVT_LISTBOX_DCLICK is invoked when a double-click event on the list box item occurs.
In the following example, a ListBox control and a TextCtrl object are respectively placed in the left and the right portion of a horizontal box sizer. ListBox is populated with strings in languages[] list object.
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)

Two objects are placed in a horizontal box sizer.
box = wx.BoxSizer(wx.HORIZONTAL) 
box.Add(lst,0,wx.EXPAND) 
box.Add(self.text, 1, wx.EXPAND)
ListBox control is linked to onListBox() handler with EVT_LISTBOX binder.
self.Bind(wx.EVT_LISTBOX, self.onListBox, lst)

The handler appends selected string into multiline TextCtrl on the right.
def onListBox(self, event): 
   self.text.AppendText( "Current selection: "+ 
      event.GetEventObject().GetStringSelection() + "\n")
The complete code is as follows −
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()
The above code produces the following output −
wx.ListCtrl is an enhanced, and therefore, more complex widget. Where a ListBox shows only one column, ListCtrl can contain multiple columns. The appearance of ListCtrl widget is controlled by the following style parameters −
wx.LC_LIST
Multicolumn list view, with optional small icons. Columns are computed automatically
wx.LC_REPORT
Single or multicolumn report view, with optional header
wx.LC_VIRTUAL
The application provides items text on demand. May only be used with wxLC_REPORT
wx.LC_ICON
Large icon view, with optional labels
wx.LC_SMALL_ICON
Small icon view, with optional labels
wx.LC_ALIGN_LEFT
Icons align to the left
wx.LC_EDIT_LABELS
Labels are editable − the application will be notified when editing starts
wx.LC_NO_HEADER
No header in report mode
wx.LC_SORT_ASCENDING
Sort in ascending order
wx.LC_SORT_DESCENDING
Sort in descending order
wx.LC_HRULES
Draws light horizontal rules between the rows in report mode
wx.LC_VRULES
Draws light vertical rules between the columns in report mode
A ListCtrl widget in report view is constructed in the following example.
self.list = wx.ListCtrl(panel, -1, style = wx.LC_REPORT)

Header columns are created by InsertColumn() method which takes the column number, caption, style and width parameters.
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)

A list of tuples, each containg three strings, called players[] stores the data which is used to populate columns of the ListCtrl object.
New row starts with InsertStringItem() method which returns the index of the current row. Use of sys.maxint gives the row number after the last row. Using the index, other columns are filled by SetStringItem() method.
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])
The complete code for the example is −
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()
The above code produces the following output. Players’ data is displayed in report view −
 Print
 Add Notes
 Bookmark this page