Бесконечная рекурсия, пытающаяся проверить все элементы TreeCtrl

У меня есть TreeCtrl, в котором более чем одному элементу может быть назначен один и тот же объект, что и 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.


person mavnn    schedule 13.05.2009    source источник


Ответы (3)


Как «следующий» элемент когда-либо будет первым элементом?

Это кажется тавтологией. Следующий никогда не бывает первым.

    current = self.GetNextVisible(current)

    current != self.GetFirstVisibleItem()

Не похоже, что next переходит к началу. Похоже, что next должен вернуть недопустимый элемент (IsOk равен False) в конце.

См. http://wxpython.org/onlinedocs.php для получения информации об этом.

person S.Lott    schedule 13.05.2009
comment
+1: за ссылку на документы и за использование слова мне пришлось искать;) - person tgray; 13.05.2009
comment
GetNextVisibleItem выполняет перенос, иначе функция завершится сама по себе после прохождения 6 элементов в моем тестовом дереве (обратите внимание, что я уже проверяю current.IsOk() ранее в функции) - person mavnn; 13.05.2009
comment
Упс. Нашел проблему, подробности смотрите в моем ответе. - person mavnn; 13.05.2009

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)
person tgray    schedule 13.05.2009

Только что понял проблему: если текущий элемент недействителен, его логическое значение равно False.

Следовательно, строка current = current или self.GetFirstVisibleItem() возвращается к первому элементу перед вызовом current.IsOk()...

person mavnn    schedule 13.05.2009