Форум сайта python.su
есть ListCtrl, при щелчке по строке нужно узнать в какой колонке произошел клик, это реально? я подозреваю что у объекта event есть какое-то свойство, но не известно какое… помоги, пожалуйста, кто сталкивался с этим.
Офлайн
Хоть бы библиотеку указал… телепаты в отпуске…
Отредактировано (Фев. 21, 2008 10:08:15)
Офлайн
гы :) действительно. wxPython2.8
Офлайн
Members
wxListEvent::wxListEvent
wxListEvent::GetCacheFrom
wxListEvent::GetCacheTo
wxListEvent::GetKeyCode
wxListEvent::GetIndex
wxListEvent::GetColumn
wxListEvent::GetPoint
wxListEvent::GetLabel
wxListEvent::GetText
wxListEvent::GetImage
wxListEvent::GetData
wxListEvent::GetMask
wxListEvent::GetItem
wxListEvent::IsEditCancelled
wxListEvent::GetColumn тебе подойдет
Офлайн
Дело в том, что GetColumn работает только при событии wx.EVT_LIST_COL_CLICK, а при wx.EVT_LIST_ITEM_SELECTED всегда возвращает 0 или я что то не правильно делаю…
Пишу вот так:
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnSelectItem, self) def OnSelectItem(self, evt): print evt.GetColumn()
Офлайн
Раз нет методов для определения номера колонки при щелчке по элементу, приходится извращаться ((
Ширина колонок, клик по которым нужно отловить, задается в коде и юзером не меняется…
И еще, 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()
Офлайн