在wxPython中查找wxTreeCtrl中的特定子项并更新TreeCtrl
我怎么能检查一个wx.TreeCtrl对象里的某个根节点是否有特定的子节点呢?
我正在写一些手动的函数,每次用户添加子节点的时候更新TreeCtrl。有没有办法让这个过程自动化呢?
3 个回答
0
这里是一个不使用递归的方法来进行文本搜索:
def GetItemByText(self, search_text, tree_ctrl_instance):
retval = None
root_list = [tree_ctrl_instance.GetRootItem()]
for root_child in root_list:
item, cookie = tree_ctrl_instance.GetFirstChild(root_child)
while item.IsOk():
if tree_ctrl_instance.GetItemText(item) == search_text:
retval = item
break
if tree_ctrl_instance.ItemHasChildren(item):
root_list.append(item)
item, cookie = tree_ctrl_instance.GetNextChild(root_child, cookie)
return retval
0
处理递归树遍历的一个更好的方法是把它放在一个生成器对象里。这样你就可以重复使用这个生成器,对树的节点进行你想要的任何操作。
def walk_branches(tree,root):
""" a generator that recursively yields child nodes of a wx.TreeCtrl """
item, cookie = tree.GetFirstChild(root)
while item.IsOk():
yield item
if tree.ItemHasChildren(item):
walk_branches(tree,item)
item,cookie = tree.GetNextChild(root,cookie)
for node in walk_branches(my_tree,my_root):
# do stuff
1
你可以考虑把数据存储在其他更容易搜索的结构里,然后用 TreeCtrl
来显示这些数据。否则,你可以像下面这样遍历 TreeCtrl
的根项下的所有子项:
def item_exists(tree, match, root):
item, cookie = tree.GetFirstChild(root)
while item.IsOk():
if tree.GetItemText(item) == match:
return True
#if tree.ItemHasChildren(item):
# if item_exists(tree, match, item):
# return True
item, cookie = tree.GetNextChild(root, cookie)
return False
result = item_exists(tree, 'some text', tree.GetRootItem())
把注释掉的行去掉,就可以实现递归搜索了。