2009-05-13 8 views
0

J'ai une TreeCtrl dans laquelle plus d'un Item peut être assigné le même objet que PyData. Lorsque l'objet est mis à jour, je veux mettre à jour tous les éléments de l'arborescence qui ont cet objet comme leur PyData.Récurrence infinie essayant de vérifier tous les éléments d'un TreeCtrl

Je pensais que le code suivant résoudrait le problème assez bien, mais pour une raison quelconque, le test logique (current! = Self.GetFirstVisibleItem()) retourne toujours vrai conduisant à une récursion infinie. Quelqu'un peut-il expliquer pourquoi?

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) 

Edit: ce qui précède est évidemment partie d'une classe basée sur wx.TreeCtrl

Répondre

0

Je viens de réaliser le problème: si current n'est pas un élément valide, sa valeur logique est False.

où le courant de ligne = courant ou self.GetFirstVisibleItem() enveloppe de retour sur le premier élément avant current.IsOk() est appelée ...

1

Il n'y a aucun moyen pour current != self.GetFirstVisibleItem() être faux. Voir les commentaires ci-dessous

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

Comment le "prochain" élément sera-t-il le premier élément?

Cela semble être une tautologie. Le prochain n'est jamais le premier.

current = self.GetNextVisible(current) 

    current != self.GetFirstVisibleItem() 

Il ne semble pas que la prochaine enveloppe au début. Il semble que next devrait retourner un élément invalide (IsOk est False) à la fin.

Voir http://wxpython.org/onlinedocs.php pour plus d'informations à ce sujet.

+0

1: pour la liaison à documents, et d'utiliser un mot I a dû regarder;) – tgray

+0

GetNextVisibleItem ne wrap, sinon la fonction serait de son propre gré après avoir traversé les 6 articles dans mon arbre de test (notez que je vérifie déjà current.IsOk() plus tôt dans la fonction) – mavnn

+0

Oops . J'ai trouvé le problème, voir ma réponse pour plus de détails. – mavnn

Questions connexes