尝试检查TreeCtrl的所有元素的无限递归

时间:2009-05-13 12:01:19

标签: python wxpython

我有一个TreeCtrl,其中可以为多个Item分配与PyData相同的对象。当对象更新时,我想更新树中具有该对象作为PyData的所有项目。

我认为以下代码可以非常巧妙地解决问题,但由于某种原因,逻辑测试(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)

编辑:上面显然是基于wx.TreeCtrl

的类的一部分

3 个答案:

答案 0 :(得分:3)

“下一个”项目将如何成为第一个项目?

这似乎是同义反复。下一个永远不是第一个。

    current = self.GetNextVisible(current)

    current != self.GetFirstVisibleItem()

似乎没有下一个包围到开头。看来next应该在结尾处返回一个无效项(IsOk为False)。

有关此信息,请参阅http://wxpython.org/onlinedocs.php

答案 1 :(得分:1)

current != self.GetFirstVisibleItem()无法伪造。见下面的评论

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)

答案 2 :(得分:0)

刚刚意识到问题:如果当前不是有效项,则其逻辑值为False。

因此行current = current或self.GetFirstVisibleItem()回调到调用current.IsOk()之前的第一个项目...