The following code works perfectly fine on Windows XP/7. But, it fails
on OSX.
import wx
import random
import os, sys
from wx.lib.agw import ultimatelistctrl as ULC
class TestUltimateListCtrl(ULC.UltimateListCtrl):
def __init__(self, parent, log):
ULC.UltimateListCtrl.__init__(self, parent, -1,
agwStyle=ULC.ULC_VIRTUAL|ULC.ULC_REPORT|ULC.ULC_SINGLE_SEL|
ULC.ULC_VRULES|ULC.ULC_HRULES)
self.SetItemCount(1000)
self.table_fields=['First','Second','Third']
field_index=0
for field in self.table_fields:
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 = wx.LIST_FORMAT_CENTER
info._kind = 1
info._text = field
info._font= wx.Font(13, wx.ROMAN, wx.NORMAL, wx.BOLD)
self.InsertColumnInfo(field_index, info)
self.SetColumnWidth(field_index,175)
field_index += 1
self.checked = []
self.Bind(ULC.EVT_LIST_ITEM_CHECKING, self.OnCheck)
def OnCheck(self, event):
item_column = (event.m_itemIndex, event.m_item.GetColumn())
try:
idx = self.checked.index(item_column)
print idx
except ValueError:
idx = None
if idx == None:
self.checked.append(item_column)
else:
del(self.checked[idx])
self.Refresh()
def getColumnText(self, index, col):
item = self.GetItem(index, col)
return item.GetText()
def OnGetItemText(self, item, col):
return "Item %d, Column %d" % (item,col)
def OnGetItemColumnImage(self, item, col):
return []
def OnGetItemImage(self, item):
return []
def OnGetItemAttr(self, item):
return None
def OnGetItemTextColour(self, item, col):
return None
def OnGetItemToolTip(self, item, col):
return None
def OnGetItemKind(self, item):
return 1
def OnGetItemColumnKind(self, item, col):
if col==0:
return self.OnGetItemKind(item)
return 0
def OnGetItemColumnCheck(self, item, column):
item_column = (item, column)
if item_column in self.checked:
return True
else:
return False
class TestFrame(wx.Frame):
def __init__(self, parent, log):
wx.Frame.__init__(self, parent, -1, "UltimateListCtrl in
wx.LC_VIRTUAL mode", size=(700, 600))
panel = wx.Panel(self, -1)
sizer = wx.BoxSizer(wx.VERTICAL)
listCtrl = TestUltimateListCtrl(panel, log)
sizer.Add(listCtrl, 1, wx.EXPAND)
panel.SetSizer(sizer)
sizer.Layout()
self.CenterOnScreen()
self.Show()
if __name__ == '__main__':
import sys
app = wx.PySimpleApp()
frame = TestFrame(None, sys.stdout)
frame.Show(True)
app.MainLoop()
The error occurs if the mouse across the window containing the list.
Following is the error stack:
Exception: invalid item index in GetItem
File "/Users/admin/NJHMIS/NJHMIS_Dashboard_wxPython/
ULC_Virtual_Column_Checking.py", line 95, in <module>
app.MainLoop()
File "/usr/local/lib/wxPython-2.9.2.4/lib/python2.7/site-packages/
wx-2.9.2-osx_cocoa/wx/_core.py", line 8622, in MainLoop
wx.PyApp.MainLoop(self)
File "/usr/local/lib/wxPython-2.9.2.4/lib/python2.7/site-packages/
wx-2.9.2-osx_cocoa/wx/_core.py", line 7914, in MainLoop
return _core_.PyApp_MainLoop(*args, **kwargs)
File "/usr/local/lib/wxPython-2.9.2.4/lib/python2.7/site-packages/
wx-2.9.2-osx_cocoa/wx/lib/agw/ultimatelistctrl.py", line 7485, in
OnMouse
newItem, hitResult = self.HitTestLine(current, x, y)
File "/usr/local/lib/wxPython-2.9.2.4/lib/python2.7/site-packages/
wx-2.9.2-osx_cocoa/wx/lib/agw/ultimatelistctrl.py", line 6800, in
HitTestLine
newItem = self.GetParent().GetItem(line, col)
File "/usr/local/lib/wxPython-2.9.2.4/lib/python2.7/site-packages/
wx-2.9.2-osx_cocoa/wx/lib/agw/ultimatelistctrl.py", line 11213, in
GetItem
return self._mainWin.GetItem(item, col)
File "/usr/local/lib/wxPython-2.9.2.4/lib/python2.7/site-packages/
wx-2.9.2-osx_cocoa/wx/lib/agw/ultimatelistctrl.py", line 8946, in
GetItem
raise Exception("invalid item index in GetItem")
Again, like I said, this works absolutely fine on Windows XP/7.
Haven't tested it on Linux yet.