[英]Wxpython: TreeCtrl: Iteration over a tree
我正在使用以下方法迭代 wxpython treectrl 的所有節點。
def get_desired_parent(self, name, selectednode = None):
if selectednode == None:
selectednode = self.treeCtrl.RootItem
# First perform the action on the first object separately
childcount = self.treeCtrl.GetChildrenCount(selectednode, False)
if childcount == 0:
return None
(item,cookie) = self.treeCtrl.GetFirstChild(selectednode)
if self.treeCtrl.GetItemText(item) == name:
return item
while childcount > 1:
childcount = childcount - 1
# Then iterate over the rest of objects
(item,cookie) = self.treeCtrl.GetNextChild(item,cookie)
if self.treeCtrl.GetItemText(item) == name:
return item
return None
當我在結構內部遞歸迭代時,多余代碼的問題變得更加明顯。 是否有另一種以更緊湊的方式執行相同操作的方法,以使我的代碼更簡潔/pythonic。
您可以使用此函數內部(僅在其命名空間中)的函數來檢查它是否與條件匹配。 如果它確實返回了該項目,如果它沒有返回,請繼續。
否則,您可以在while
行之后檢查您的狀況。 這樣, item
變量將由循環之前的第一個子item
定義,並像其他任何項一樣進行評估。
還有一種方式:(或兩者的混合)
(child, cookie) = self.GetFirstChild(item)
while child.IsOk():
do_something(child)
(child, cookie) = self.GetNextChild(item, cookie)
這是一個完整的示例,首先遍歷樹的深度。 該功能綁定到右側按鈕。
def OnRightDown(self, event):
def showChildren(item,cookie):
# functions goes recursively down the tree
if item.IsOk():
child, cookie = self.tree.GetFirstChild(item)
while child.IsOk():
child, cookie = self.tree.GetNextChild(child, cookie)
if child:
print(self.tree.GetItemText(child)) #show child label name
showChildren(child,cookie)
pt = event.GetPosition()
item, flags = self.tree.HitTest(pt)
if item:
print(self.tree.GetItemText(item)) #show parent label name
showChildren(item,0) #iterate depth first into the tree
使您的代碼在此處具有高度可讀性的最佳方法是使其簡短且功能強大。
如果您需要遍歷所有樹項並首先遍歷深度。 這是一個單一的快速功能。 給它一個函數來獲取每個項目,以及你從哪里開始(通常是 self.root)。 它也非常可重用,因為您可能經常這樣做。
def depth_first_tree(self, funct, item):
(child, cookie) = self.tree.GetFirstChild(item)
while child.IsOk():
self.depth_first_tree(funct, child)
funct(child)
(child, cookie) = self.tree.GetNextChild(item, cookie)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.