我有一个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
的类的一部分答案 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()之前的第一个项目...