Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 21, 2008 09:59:50

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

ListCtrl узнать номер колонки

есть ListCtrl, при щелчке по строке нужно узнать в какой колонке произошел клик, это реально? я подозреваю что у объекта event есть какое-то свойство, но не известно какое… помоги, пожалуйста, кто сталкивался с этим.



Офлайн

#2 Фев. 21, 2008 10:07:43

balu
От:
Зарегистрирован: 2006-05-24
Сообщения: 521
Репутация: +  0  -
Профиль   Отправить e-mail  

ListCtrl узнать номер колонки

Хоть бы библиотеку указал… телепаты в отпуске…



Отредактировано (Фев. 21, 2008 10:08:15)

Офлайн

#3 Фев. 22, 2008 06:13:39

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

ListCtrl узнать номер колонки

гы :) действительно. wxPython2.8



Офлайн

#4 Фев. 22, 2008 17:26:04

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ListCtrl узнать номер колонки

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 тебе подойдет



Офлайн

#5 Фев. 25, 2008 09:14:57

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

ListCtrl узнать номер колонки

Дело в том, что 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()



Офлайн

#6 Фев. 26, 2008 07:45:23

hellslade
От:
Зарегистрирован: 2008-01-28
Сообщения: 240
Репутация: +  0  -
Профиль   Отправить e-mail  

ListCtrl узнать номер колонки

Раз нет методов для определения номера колонки при щелчке по элементу, приходится извращаться ((
Ширина колонок, клик по которым нужно отловить, задается в коде и юзером не меняется…
И еще, 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()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version