2009-05-13 11 views
0

私は、複数のアイテムにPyDataと同じオブジェクトを割り当てることができるTreeCtrlを持っています。オブジェクトが更新されると、そのオブジェクトをPyDataとして持つツリー内のすべてのアイテムを更新する必要があります。TreeCtrlのすべての要素をチェックしようとする無限再帰

私は次のコードで問題をきちんと解決できると思っていましたが、何らかの理由で論理テスト(current!= self.GetFirstVisibleItem())がtrueを返すと無限再帰が発生します。なぜ誰かが説明できますか?

def RefreshNodes(self, obj, current=None): 
    print "Entered refresh" 
    current = current or self.GetFirstVisibleItem() 
    if current.IsOk(): 
     print self.GetPyData(current).name 
     if self.GetPyData(current) == obj: 
      self.RefreshNode(current) 
     current = self.GetNextVisible(current) 
     if current != self.GetFirstVisibleItem(): 
      self.RefreshNodes(obj, current) 

編集:上記はcurrent != self.GetFirstVisibleItem()が偽であるために方法はありませんwx.TreeCtrl

答えて

0

現状が有効な項目でない場合、論理値はFalseです。

したがって線電流=()バックcurrent.IsOk()が呼び出される前に、最初の項目にラップ...電流またはself.GetFirstVisibleItem

1

に基づいて明らかにクラスの一部です。以下のコメントを参照

def RefreshNodes(self, obj, current=None): 
    print "Entered refresh" 
    current = current or self.GetFirstVisibleItem() 
    if current.IsOk(): 
     print self.GetPyData(current).name 
     if self.GetPyData(current) == obj: 
      self.RefreshNode(current) 

     #current = next visible item 
     current = self.GetNextVisible(current) 

     #current can't equal the first visible item because 
     # it was just set to the next visible item, which 
     # logically cannot be first 
     if current != self.GetFirstVisibleItem(): 
      self.RefreshNodes(obj, current) 
3

"次の"アイテムはどのように最初のアイテムになりますか?

これは同義語のようです。次は決して最初です。

current = self.GetNextVisible(current) 

    current != self.GetFirstVisibleItem() 

次は先頭に折り返して表示されません。 nextは、最後に無効な項目(IsOkはFalse)を返さなければなりません。

詳細については、http://wxpython.org/onlinedocs.phpを参照してください。

+0

+1:ドキュメントにリンクするための、および単語Iを使用するため) – tgray

+0

GetNextVisibleItemはラップします。それ以外の場合は、テストツリーの6つの項目を通過した後に機能が終了します(関数の前のcurrent.IsOk()を確認しています)。 – mavnn

+0

。問題が見つかりました、詳細は私の答えを見てください。 – mavnn

関連する問題