Найти - Пользователи
Полная версия: ListCtrl узнать номер колонки
Начало » GUI » ListCtrl узнать номер колонки
1
hellslade
есть ListCtrl, при щелчке по строке нужно узнать в какой колонке произошел клик, это реально? я подозреваю что у объекта event есть какое-то свойство, но не известно какое… помоги, пожалуйста, кто сталкивался с этим.
balu
Хоть бы библиотеку указал… телепаты в отпуске…
hellslade
гы :) действительно. 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 тебе подойдет
hellslade
Дело в том, что 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()
hellslade
Раз нет методов для определения номера колонки при щелчке по элементу, приходится извращаться ((
Ширина колонок, клик по которым нужно отловить, задается в коде и юзером не меняется…
И еще, 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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB