VitualTreeサンプル

http://www.wxpython.org/docs/api/wx.lib.mixins.treemixin.VirtualTree-class.html

wxLC_VIRTUALのツリー版だそうで。
これはなかなか快適そうだ。

#!/usr/bin/python
# coding: utf-8
# 2009/12/8 4タブ化してVTree.SelectPath()を追記

import wx
from wx.lib.mixins import treemixin

class TreeModel(object):
    def __init__(self, root):
        self.root=root

    # @param indices[in] 目的のノードへのパスをtupleで受ける
    # rootノードは ()
    # rootの一つ目の子ノードは (0, ) (1要素のタプルは不許可)
    # その2番目の子ノードは (0, 1) という具合
    def GetItem(self, indices):
        print indices
        node=self.root
        # パスを辿っていく
        for index in indices:
            node=node[1][index]
        return node

    def GetText(self, indices):
        return self.GetItem(indices)[0]


class VTree(treemixin.VirtualTree, wx.TreeCtrl):
    def __init__(self, parent, model):
        super(VTree, self).__init__(parent)
        self.model=model
        self.RefreshItems()

    # 以下の2つが最低限必要
    def OnGetItemText(self, indices):
        return self.model.GetText(indices)
        
    def OnGetChildrenCount(self, indices):
        return len(self.model.GetItem(indices)[1])

    # 追記
    # indexのリストからノードを選択状態にする
    def SelectPath(self, indices):
        item=self.GetRootItem()
        while len(indices)>0:
            index=indices.pop(0)
            item, cookie=self.GetFirstChild(item)
            for i in xrange(index):
                item=self.GetNextSibling(item)
        self.SelectItem(item)
        self.EnsureVisible(item)


class MyFrame(wx.Frame):
    def __init__(self, parent):
        super(MyFrame, self).__init__(parent)

        # tree data
        tree=('root', [
            ('node1', []), 
            ('node2', [
                ('node21', [
                    ('node211', [
                        ])
                    ])
                ]),
            ('node3', []),
            ]
            )

        model=TreeModel(tree)

        VTree(self, model)

app=wx.App()
frame=MyFrame(None)
frame.Show()
app.MainLoop()