Раз нет методов для определения номера колонки при щелчке по элементу, приходится извращаться ((
Ширина колонок, клик по которым нужно отловить, задается в коде и юзером не меняется…
И еще, FindItemAtPos почему то всегда возвращает -1…отсюда лишние телодвижения…
# -*- coding: cp1251 -*-
import wx
class List(wx.ListCtrl):
def __init__(self, parent):
wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT|wx.LC_HRULES|wx.LC_VRULES)
self.il = wx.ImageList(16, 16)
self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
busy = wx.Image("images/1.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
busy = self.im = self.il.Add(busy)
out = wx.Image("images/2.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
out = self.im = self.il.Add(out)
self.InsertColumn(0, "Name")
self.InsertColumn(1, "Busy")
self.InsertColumn(2, "Out")
self.SetColumnWidth(0, 200)
self.SetColumnWidth(1, 16)
self.SetColumnWidth(2, 16)
for i in range(10):
item = wx.ListItem()
item.SetImage(-1)
self.InsertItem(item)
self.SetStringItem(0, 0, "PPZ"+str(i))
self.SetItemColumnImage(0, 1, busy)
self.SetItemColumnImage(0, 2, out)
self.Bind(wx.EVT_LEFT_DOWN, self.OnClick, self)
def GetItemIdAtPos(self, pos):
"""Находим id item'a по позиции клика. FindItemAtPos всегда возвращает -1 ((
"""
itemIndex = -1
for idx in range(self.GetItemCount()):
r = self.GetItemRect(idx)
if r.GetLeft() <= pos.x <= r.GetRight() and r.GetTop() <= pos.y <= r.GetBottom():
itemIndex = idx
break
return itemIndex
def OnClick(self, evt):
itemIndex = self.GetItemIdAtPos(evt.GetPosition())
self.XPos = evt.GetX()
self.sizeX = self.GetClientSize()[0]
busycol = self.sizeX-32
outcol = self.sizeX-16
if self.XPos in range(busycol, busycol+16):
print "busy column in", itemIndex, " item"
if self.XPos in range(outcol, outcol+16):
print "out column in", itemIndex, " item"
self.XPos = 0
evt.Skip()
class TestFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Test", size=(500, 400))
self.list = List(self)
sizer = wx.BoxSizer()
sizer.Add(self.list, 1, wx.EXPAND)
self.SetSizer(sizer)
self.Bind(wx.EVT_SIZE, self.OnSize, self)
def OnSize(self, evt):
self.list.SetSize(self.GetClientSize())
self.list.SetColumnWidth(0, self.list.GetClientSize()[0]-32)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = TestFrame(None)
frame.Show(True)
app.MainLoop()