2011-12-06 40 views
2

wx.TreeCtrlは(wxPythonの)リストからデータを表示するために使用されます。ツリービューを更新する(つまり、wx.TreeCtrl.Refreshを呼び出して)リスト内のデータが変更された場合、ツリーを作成する方法は?wxPythonのwx.TreeCtrlの自動更新

(データベースから構築された)リスト自体は次のように構成されています

def Refresh(self): 
    self.CollapseAll() 
    self.Expand(self.root) 
:私は作品のようなものが仮想ツリーを作成するとして更新を無効にすることです見つけ

data = [ 'item1', 
     ['item2', ['item2.1','item2.2'],], 
     ['item3', [['item3.1', ['item3.1.1','item3.1.2']]]],] 

一つの解決策

ツリーが仮想であるため、展開するとすべてのノードがリストから再度読み込まれます。しかし、リフレッシュのオーバーライドはおそらくハックであり、私はよりクリーンなソリューションを探しています。グリッドとテーブル(http://svn.wxwidgets.org/viewvc/wx/wxPython/trunk/demo/Grid_MegaExample.py?view=markup)のためにそれを行うには良い例がありますが、何も見つかりません木。時にはそれが質問を策定するのが最善です問題を解決する

EDIT & ANSWER

。私は、RappinとDunnの "wxPython in Action"に記述されているような仮想ツリーを使っていました。しかし、それは貧しい人の解決策です。 VirtualTreeからクラスを派生させるのが正しいでしょう。誰かが同じ問題につまずく場合は、ここにソリューションを投稿してください。この解決策は、(http://wxwidgets2.8.sourcearchive.com/documentation/2.8.8.0/TreeMixin_8py-source.html)からプルーンダウンされたバージョンです。

import wx 
from wx.lib.mixins.treemixin import VirtualTree 
items = [('item 0', [('item 2', [('a1', []),('b1', [])]), ('item 3', [])]), 
     ('item 1', [('item 4', [('a3', []),('b3', [])]), ('item 5', [])])] 

class MyTree(VirtualTree, wx.TreeCtrl): 
    def __init__(self, *args, **kw): 
     super(MyTree, self).__init__(*args, **kw) 
     self.RefreshItems() 
     #OnTest emulates event that causes data to change 
     self.Bind(wx.EVT_KEY_DOWN, self.OnTest) 
    def OnTest(self, evt): 
     items[0]=('boo', [('item 2', [('a1', []),('b1', [])]), ('item 3', [])]) 
     self.RefreshItems()   
    def OnGetItemText(self, index): 
     return self.GetText(index) 
    def OnGetChildrenCount(self, indices): 
     return self.GetChildrenCount(indices) 
    def GetItem(self, indices): 
     text, children = 'Hidden root', items 
     for index in indices: text, children = children[index] 
     return text, children 
    def GetText(self, indices): 
     return self.GetItem(indices)[0] 
    def GetChildrenCount(self, indices): 
     return len(self.GetChildren(indices)) 
    def GetChildren(self, indices): 
     return self.GetItem(indices)[1]  

class TreeFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title='wxTree Test Program') 
     self.tree = MyTree(self, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT) 

if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = TreeFrame() 
    frame.Show() 
    app.MainLoop() 

答えて

1

私はこの種の問題に最も適切な解決策は、具体的には、のpubsubライブラリをObserverパターンを使用していると思う:wxPython and PubSub

+0

Observerパターンは、溶液をさらに向上させることができます。これは、データを変更する関数からメッセージを送信することを可能にし、すべてのツリーがこのイベントをサブスクライブすることができます(実際のアプリケーションでは、更新する必要のあるツリーとテーブルがいくつかあります)。 RefreshItems()を呼び出すことができるようにするためには、問題の解決策がまだ必要です。しかし、お返事いただきありがとうございます!私は恥ずかしいです、私は観察者のパターンについては考えませんでした。現在、データを変更した関数で、必要なすべてのリフレッシュ関数を明示的に呼び出しました。 – bitman