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 に答える