wx.TreeCtrlオブジェクトの特定のルートに特定の子があるかどうかを確認するにはどうすればよいですか?wxTreeCtrlで特定の子を見つけてwxPythonでTreeCtrlを更新する
私は子供がユーザーによって追加されるたびにTreeCtrlを更新する手動関数を書いています。これを自動化する方法はありますか?
wx.TreeCtrlオブジェクトの特定のルートに特定の子があるかどうかを確認するにはどうすればよいですか?wxTreeCtrlで特定の子を見つけてwxPythonでTreeCtrlを更新する
私は子供がユーザーによって追加されるたびにTreeCtrlを更新する手動関数を書いています。これを自動化する方法はありますか?
データを簡単に検索できる他の構造で保存し、そのデータを表示するために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())
をそれ再帰検索になりますコメント行のコメントを外します。テキストで検索するための
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
再帰的なツリートラバーサルを処理するためのよりよい方法は、あなたが、あなたのツリーノード上の好きな操作を実行するを再利用することができますジェネレータオブジェクト、でそれをラップすることです再帰なし:
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
: