Search code examples
pythonwxpython

ultimatelistctrl: list index out of range


I am using the UltimateListCtrl in wxPython. I can get the demo code on Mouse vs Python to work, but when i try to adapt it. Or, even copy and paste it into my program it fails with:

Traceback (most recent call last):
File "C:\Users\dgunter\Documents\GitHub\TimeJobTracker\timejob.py", line 346, in ArchiveJobs
jobwin = ArchiveJobWindow(self)
File "C:\Users\dgunter\Documents\GitHub\TimeJobTracker\timejob.py", line 87, in __init__
mylist.SetStringItem(0, 1, "Go")
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\lib\agw\ultimatelistctrl.py", line 11366, in SetStringItem
self._mainWin.SetItem(info)
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\lib\agw\ultimatelistctrl.py", line 8802, in SetItem
line.SetItem(item._col, item)
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\lib\agw\ultimatelistctrl.py", line 4095, in SetItem
item = self._items[index]
IndexError: list index out of range

Here is the code I am working with, you will notice the list items are copied from the link I gave. My actual data is loaded form a database I just left that part out.

import wx
from wx.lib.agw import ultimatelistctrl as ULC

class ArchiveJobWindow(wx.Frame):
    def __init__(self, parent):
        super(ArchiveJobWindow, self).__init__(parent, title='Archive Unused Jobs', style=wx.CAPTION, size=(650,350))

        self.parent = parent
        self.panel = wx.Panel(self, wx.ID_ANY)
        topSizer = wx.BoxSizer(wx.VERTICAL)
        buttonSizer = wx.BoxSizer(wx.HORIZONTAL)

        font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
        boldfont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
        boldfont.SetWeight(wx.BOLD)
        boldfont.SetPointSize(12)


        mylist = ULC.UltimateListCtrl(self.panel, agwStyle=wx.LC_REPORT|wx.LC_VRULES|wx.LC_HRULES|wx.LC_SINGLE_SEL|0x0010, size=(200, 100))

        info = ULC.UltimateListItem()
        info._mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT | ULC.ULC_MASK_CHECK
        info._image = []
        info._format = 0
        info._kind = 1
        info._text = "Artist Name"
        mylist.InsertColumnInfo(0, info)

        info = ULC.UltimateListItem()
        info._format = wx.LIST_FORMAT_RIGHT
        info._mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT | ULC.ULC_MASK_FONT
        info._image = []
        info._text = "Title"
        info._font = boldfont
        mylist.InsertColumnInfo(1, info)

        info = ULC.UltimateListItem()
        info._mask = wx.LIST_MASK_TEXT | wx.LIST_MASK_IMAGE | wx.LIST_MASK_FORMAT
        info._format = 0
        info._text = "Genre"
        info._font = font
        info._image = []
        mylist.InsertColumnInfo(2, info)

        mylist.InsertStringItem(0, "Newsboys")
        mylist.SetStringItem(0, 1, "Go")
        mylist.SetStringItem(0, 2, "Rock")

        mylist.InsertStringItem(1, "Puffy")
        mylist.SetStringItem(1, 1, "Bring It!")
        mylist.SetStringItem(1, 2, "Pop")

        mylist.InsertStringItem(2, "Family Force 5")
        mylist.SetStringItem(2, 1, "III")
        mylist.SetStringItem(2, 2, "Crunk")

        mylist.SetColumnWidth(0, 150)
        mylist.SetColumnWidth(1, 200)
        mylist.SetColumnWidth(2, 100)


        cancelbutton = wx.Button(self.panel, id=wx.ID_CANCEL)
        Okbutton = wx.Button(self.panel, id=wx.ID_OK)




        # panelSizer.Add(self.panel, 1, wx.EXPAND)
        buttonSizer.AddStretchSpacer(6)
        buttonSizer.Add(cancelbutton, 1, wx.ALIGN_RIGHT, 0)
        buttonSizer.Add((20,0))
        buttonSizer.Add(Okbutton, 1, wx.ALIGN_RIGHT, 0)
        buttonSizer.AddStretchSpacer(1)

        topSizer.AddStretchSpacer(2)
        topSizer.Add(mylist)
        topSizer.AddStretchSpacer(2)
        topSizer.Add(buttonSizer, 1, wx.ALIGN_RIGHT, 0)
        topSizer.Add((0,20))
        # panelSizer.Add(topSizer, 1, wx.EXPAND)
        self.panel.SetSizer(topSizer)


app = wx.App(False)
window = ArchiveJobWindow(None)
window.Show()


app.MainLoop()

Any advice is welcome.

Thanks


Solution

  • I do not understand why, but it makes it work if you change this line:

    mylist = ULC.UltimateListCtrl(self.panel, agwStyle=wx.LC_REPORT|wx.LC_VRULES|wx.LC_HRULES|wx.LC_SINGLE_SEL|0x0010, size=(200, 100))
    

    to this:

    mylist = ULC.UltimateListCtrl(self.panel, agwStyle=ULC.ULC_REPORT, size=(200, 100))
    

    It makes since because in order to get the example to even run I had to add the 0x0010

    I think the examples must be outdated.