如何获取wxListCtrl中项目的信息?

时间:2013-05-03 08:54:20

标签: python wxpython

我有一个使用wxListCtrl生成的列表,其中有三个coloumns。列表更新时生成的数据需要在我的代码的其他部分使用。任何人请告诉我如何获得列表中所有3个coloumns的项目的所有值? 我的清单如下......

self.list_ctrl = wx.ListCtrl(self.panel, size=(565,150),pos=(15,20),style=wx.LC_REPORT | wx.BORDER_SUNKEN)
self.name=self.list_ctrl.InsertColumn(0, 'Task Name',width=189)
self.date=self.list_ctrl.InsertColumn(1, 'Run ',width=189)
self.status=self.list_ctrl.InsertColumn(2, 'Status', width=187
self.index=0

使用..

生成项目
Taskname=self.list_ctrl.InsertStringItem(self.index,task)
Taskdate=self.list_ctrl.SetStringItem(self.index, 1,strftime("%d-%m-%Y", gmtime()))
Tasktime=self.list_ctrl.SetStringItem(self.index,2,datetime.now().strftime('%H:%M:%S'))

我可以使用

获取该项目的名称,即“self.name”,该名称属于第一个coloumn
name=self.list_ctrl.GetItemText(self.name)

但'self.date'和'self.time'正在返回int类型值。如何分别在变量'Taskdate'和'Tasktime'中获取日期和时间?

1 个答案:

答案 0 :(得分:4)

有几种方法可以做到这一点。最简单的(在我看来)是将对象与每一行相关联,但我们将首先采用“硬”方式:

import wx

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial")

        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        self.index = 0

        self.list_ctrl = wx.ListCtrl(panel, size=(-1,100),
                         style=wx.LC_REPORT
                         |wx.BORDER_SUNKEN
                         )
        self.list_ctrl.InsertColumn(0, 'Subject')
        self.list_ctrl.InsertColumn(1, 'Due')
        self.list_ctrl.InsertColumn(2, 'Location', width=125)

        btn = wx.Button(panel, label="Add Line")
        btn2 = wx.Button(panel, label="Get Data")
        btn.Bind(wx.EVT_BUTTON, self.add_line)
        btn2.Bind(wx.EVT_BUTTON, self.getColumn)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(btn2, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)

    #----------------------------------------------------------------------
    def add_line(self, event):
        line = "Line %s" % self.index
        self.list_ctrl.InsertStringItem(self.index, line)
        self.list_ctrl.SetStringItem(self.index, 1, "01/19/2010")
        self.list_ctrl.SetStringItem(self.index, 2, "USA")
        self.index += 1

    #----------------------------------------------------------------------
    def getColumn(self, event):
        """"""
        count = self.list_ctrl.GetItemCount()
        cols = self.list_ctrl.GetColumnCount()
        for row in range(count):
            for col in range(cols):
                item = self.list_ctrl.GetItem(itemId=row, col=col)
                print item.GetText()

#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

从早期的answer到类似的问题略有修改。无论如何,让我们来看看如何使用对象:

import wx

########################################################################
class Car(object):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, make, model, year, color="Blue"):
        """Constructor"""
        self.make = make
        self.model = model
        self.year = year
        self.color = color


########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        rows = [Car("Ford", "Taurus", "1996"),
                Car("Nissan", "370Z", "2010"),
                Car("Porche", "911", "2009", "Red")
                ]

        self.list_ctrl = wx.ListCtrl(self, size=(-1,100),
                                style=wx.LC_REPORT
                                |wx.BORDER_SUNKEN
                                )
        self.list_ctrl.Bind(wx.EVT_LIST_ITEM_SELECTED, self.onItemSelected)
        self.list_ctrl.InsertColumn(0, "Make")
        self.list_ctrl.InsertColumn(1, "Model")
        self.list_ctrl.InsertColumn(2, "Year")
        self.list_ctrl.InsertColumn(3, "Color")

        index = 0
        self.myRowDict = {}
        for row in rows:
            self.list_ctrl.InsertStringItem(index, row.make)
            self.list_ctrl.SetStringItem(index, 1, row.model)
            self.list_ctrl.SetStringItem(index, 2, row.year)
            self.list_ctrl.SetStringItem(index, 3, row.color)
            self.myRowDict[index] = row
            index += 1

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
        self.SetSizer(sizer)

    #----------------------------------------------------------------------
    def onItemSelected(self, event):
        """"""
        currentItem = event.m_itemIndex
        car = self.myRowDict[currentItem]
        print car.make
        print car.model
        print car.color
        print car.year

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY, "List Control Tutorial")
        panel = MyPanel(self)
        self.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

这里我们创建一个Car对象列表,我们使用点符号将类的属性添加到ListCtrl。然后,当我们从列表中选择一个项目时,我们从事件对象中获取当前选定的项目并使用字典查找它。不是很简单,但我更喜欢它。您可以阅读更多相关信息以及其他提示和技巧here

但是,我认为最好的解决方案是使用ObjectListView(一个ListCtrl包装器),使行成为真正的对象,并允许更容易地访问它们的值,以及引入一堆其他增强功能。可悲的是,它还不是正常的wxPython发行版的一部分,但它很容易从PyPI添加。您也可以在博客的article中阅读更多相关信息!