0

我正在尝试对我的数据进行排序,类似于此处的排序示例:http: //www.blog.pythonlibrary.org/2011/01/04/wxpython-wx-listctrl-tips-and-tricks/

但是由于某种原因,当我的数据出现在表格中时,事情就变得无处不在。例如,计算机名称与所有者不匹配。起初我虽然没有正确创建字典。但后来我尝试打印它,字典看起来非常好。因此,错误必须与 list_ctrl 一致。你知道我的错误在哪里吗?

#!/usr/bin/env python
import wx
import wx.lib.mixins.listctrl as listmix
import csv
from wxPython.wx import *

key_index = 4

##########################################################################
info = csv.reader(open(report.csv', 'rb'),delimiter=',')
length = 0
info_list = []

for row in info: #search each row in the report
    info_list.append([length,row[1],row[4]])
    length = length + 1

dict_info = {}
rows = 0

for item in info_list:
    dict_info[item[rows]] = (item[rows + 1], item[rows + 2])
####################################################################
class TestListCtrl(wx.ListCtrl):
    def __init__(self, parent, ID=wx.ID_ANY, pos=wx.DefaultPosition,
                    size=wx.DefaultSize, style=0):
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
########################################################################
class TestListCtrlPanel(wx.Panel, listmix.ColumnSorterMixin):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
        self.index = 0

        self.list_ctrl = TestListCtrl(self, size=(-1,100),style=wx.LC_REPORT
                                        |wx.BORDER_SUNKEN|wx.LC_SORT_ASCENDING)
        self.list_ctrl.InsertColumn(0, "Computer Name")
        self.list_ctrl.InsertColumn(1, "Owner")

        items = dict_info.items()
        index = 0
        for key, data in items:
            self.list_ctrl.InsertStringItem(self.index, data[0])
            self.list_ctrl.SetStringItem(self.index, 1, data[1])
            self.list_ctrl.SetItemData(self.index, key)
            index += 1

        # Now that the list exists we can init the other base class,
        # see wx/lib/mixins/listctrl.py
        self.itemDataMap = dict_info
        listmix.ColumnSorterMixin.__init__(self, 2)
        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list_ctrl)

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

    #----------------------------------------------------------------------
    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
    def GetListCtrl(self):
        return self.list_ctrl

    #----------------------------------------------------------------------
    def OnColClick(self, event):
        print "column clicked"
        event.Skip()

########################################################################

###################################################################


class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 
                            "Search")

        panel = TestListCtrlPanel(self) #create a panel


#run code
if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame()
    frame.Show()
    app.MainLoop()
4

2 回答 2

0

看起来您复制并粘贴了我的代码,但更改了关键部分。您需要将init中的 for 循环更改为如下所示:

for key, data in items:
    print "%s: %s - %s" % (key, data[0], data[1])
    print
    self.list_ctrl.InsertStringItem(index, data[0])
    self.list_ctrl.SetStringItem(index, 1, data[1])
    self.list_ctrl.SetItemData(index, key)
    index += 1

我在示例中留下的“self.index”设置为零,但我从未在该循环中使用它。相反,我创建了一个名为index的局部变量并使用它。我已通过删除self.index位来修复我的文章,因为在该特定示例中不需要它。

在您的代码中,您增加索引,但在所有 self.list_ctrl.*() 方法中使用 self.index。

于 2013-07-01T21:10:39.673 回答
0

我一直在从 Mike Driscoll 关于 mixin 的帖子中学习。 http://www.blog.pythonlibrary.org/2011/01/04/wxpython-wx-listctrl-tips-and-tricks/ 制作任何文本逗号分隔符文件。
这是更好的方法:

import csv
import sys
import wx
import  wx.lib.mixins.listctrl  as  listmix

info = csv.reader(open('yourFile.txt', 'rb'),delimiter=',')
sortedlist = sorted(info, key=operator.itemgetter(1), reverse=True)

length = 0
textDB = []
for row in sortedlist: 
    textDB.append([length,row[0],row[1]])
    length = length + 1
dict_info = {}
rows = 0

for item in textDB:
    dict_info[item[rows]] = (item[rows + 1], item[rows + 2])

class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin) :    
    def __init__(self, parent, ID, pos=wx.DefaultPosition,
                  size=wx.DefaultSize, style=0) :        
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)        
        listmix.ListCtrlAutoWidthMixin.__init__(self)

class TabPanel(wx.Panel, listmix.ColumnSorterMixin) :
    ''' This will be [ inserted into ] the second notebook tab. '''    
    def __init__(self, parent) :        
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)        
        self.createAndLayout()    

    def createAndLayout(self) :        
        sizer = wx.BoxSizer( wx.VERTICAL)
        self.list = TestListCtrl(self, wx.ID_ANY, style=wx.LC_REPORT
                                 | wx.BORDER_NONE
                                 | wx.LC_EDIT_LABELS
                                 | wx.LC_SORT_ASCENDING)        
        sizer.Add(self.list, 1, wx.EXPAND)
        self.populateList()        
        self.itemDataMap = textDB
        listmix.ColumnSorterMixin.__init__(self, 3)
        self.SetSizer(sizer)
        self.SetAutoLayout(True)

    def populateList(self) :        
        self.list.InsertColumn(0, 'F1')
        self.list.InsertColumn(1, 'F2')
#        self.list.InsertColumn(2, 'F3')
        items = dict_info.items()        
        for key, data in items :
            index = self.list.InsertStringItem(sys.maxint, data[0])
            self.list.SetStringItem(index, 0, data[0])
            self.list.SetStringItem(index, 1, data[1])
#            self.list.SetStringItem(index, 2, data[2])
            self.list.SetItemData(index, key)          

        self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
        self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
#        self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE)

        self.list.SetItemState(5, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
        item = self.list.GetItem(1)
        item.SetTextColour(wx.BLUE)
        self.list.SetItem( item )
        item = self.list.GetItem(4)
        item.SetTextColour(wx.RED)
        self.list.SetItem(item)
        self.currentItem = 0

    def GetListCtrl(self) :
        """ Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py """
        return self.list

if __name__ == "__main__" :    
    class DemoFrame(wx.Frame) :
        def __init__(self) :
            wx.Frame.__init__(self, None, wx.ID_ANY, title="Panel Tutorial",
                               size=(600, 300))            
            panel = TabPanel(self)
            self.Show()    
    app = wx.App()
    frame = DemoFrame()
    app.MainLoop()
于 2013-09-28T00:40:29.983 回答