2017-05-04 19 views
2

如何通過樹的索引獲取樹項目的數據?wxPython TreeCtrl:通過索引獲取treeitem的數據

我目前正在用wxPython編寫一個GUI(使用Python 2.7)。這個圖形用戶界面包含一個CustomTreeCtrl,其內容如下:

# Create Tree control 
    widget_tree = CustomTreeCtrl(parent=self, id=ID_WIDGET_TREE, agwStyle=wx.TR_HIDE_ROOT | wx.TR_SINGLE | wx.TR_HAS_BUTTONS, 
           size=(UI_tree_width, -1)) 
    widget_tree.SetBackgroundColour(wx.WHITE) 
    root = widget_tree.AddRoot(text="root") 

# Create general 
    item_general = widget_tree.AppendItem(parentId=root, text='General') 
    item_main = widget_tree.AppendItem(parentId=item_general, text='Main', data={'tooltip': 'Main'}) 
    widget_tree.AppendItem(parentId=item_general, text='Manual', data={'tooltip': 'Manual'}) 
    widget_tree.AppendItem(parentId=item_general, text='Boundary conditions', data={'tooltip': 'BC'}) 

    # Create stiffeners 
    item_stiffener = widget_tree.AppendItem(parentId=root, text='Stiffeners') 
    widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 1', data={'tooltip': 'Stiffener 1'}) 
    widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 2', data={'tooltip': 'Stiffener 2'}) 
    widget_tree.AppendItem(parentId=item_stiffener, text='Add stiffener', data={'tooltip': 'Creates a new stiffener'}) 

數據將以用戶的某些輸入進行擴展。除此之外,點擊「添加加強筋」將在「加強筋」上面插入一個項目。 爲了這個工具的目的,我需要從每個加強筋中獲取這些數據。 我想知道是否有可能在列表中調用這些列表。因此,舉例來說,我可以爲[root] [stiffeners] [stiffener 1]調用widget_tree.GetTreeItem [0] [1] [0],依此類推。

我一直在尋找一段時間,希望有人能幫助我。提前致謝!

回答

0

我繼承了一個項目,它有一個非常複雜的方式來完成你所要求的工作,但是你的文章給了我一個新的想法。從概念上講,我覺得你在談論在這個例子類似get_item_by_indexes方法的東西(我在所有的調試輸出左):

import wx 
from wx.lib.agw.customtreectrl import CustomTreeCtrl 

class IndexTree(CustomTreeCtrl): 
def get_item_by_indexes(self, *args): 
    args = list(args) # copy so we don't modify original 
    print("Trying tree index: %s" % str(args)) 
    if args[0] > 0: 
     raise IndexError("Invalid root index") 
    parent = self.GetRootItem() 
    print("arg_index=0, tree_index=0, item=%s" % (parent.GetText())) 
    for arg_index, tree_index in enumerate(args[1:], 1): 
     parent = parent.GetChildren()[tree_index] 
     print("arg_index=%d, tree_index=%d, item=%s" % (arg_index, tree_index, parent.GetText())) 
    return parent 

class MyFrame(wx.Frame): 
    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.DefaultSize) 
     widget_tree = IndexTree(parent=self, agwStyle=wx.TR_HIDE_ROOT | wx.TR_SINGLE | wx.TR_HAS_BUTTONS, 
           size=(400, -1)) 
     widget_tree.SetBackgroundColour(wx.WHITE) 
     root = widget_tree.AddRoot(text="root") 

    # Create general 
     item_general = widget_tree.AppendItem(parentId=root, text='General') 
     item_main = widget_tree.AppendItem(parentId=item_general, text='Main', data={'tooltip': 'Main'}) 
     widget_tree.AppendItem(parentId=item_general, text='Manual', data={'tooltip': 'Manual'}) 
     widget_tree.AppendItem(parentId=item_general, text='Boundary conditions', data={'tooltip': 'BC'}) 

     # Create stiffeners 
     item_stiffener = widget_tree.AppendItem(parentId=root, text='Stiffeners') 
     widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 1', data={'tooltip': 'Stiffener 1'}) 
     widget_tree.AppendItem(parentId=item_stiffener, text='Stiffener 2', data={'tooltip': 'Stiffener 2'}) 
     widget_tree.AppendItem(parentId=item_stiffener, text='Add stiffener', data={'tooltip': 'Creates a new stiffener'}) 

     widget_tree.get_item_by_indexes(0) 
     widget_tree.get_item_by_indexes(0, 1) 
     widget_tree.get_item_by_indexes(0, 0, 0) 
     widget_tree.get_item_by_indexes(0, 1, 0) 
     widget_tree.get_item_by_indexes(0, 1, 2) 
     try: 
      widget_tree.get_item_by_indexes(0, 1, 8) 
     except IndexError, e: 
      print(e) 

class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, -1, 'IndexTree') 
     frame.Show(True) 
     frame.Centre() 
     return True 

if __name__ == '__main__': 
    app = MyApp(0) 
    app.MainLoop() 

這對於測試用例生成:

Trying tree index: [0] 
arg_index=0, tree_index=0, item=root 
Trying tree index: [0, 1] 
arg_index=0, tree_index=0, item=root 
arg_index=1, tree_index=1, item=Stiffeners 
Trying tree index: [0, 0, 0] 
arg_index=0, tree_index=0, item=root 
arg_index=1, tree_index=0, item=General 
arg_index=2, tree_index=0, item=Main 
Trying tree index: [0, 1, 0] 
arg_index=0, tree_index=0, item=root 
arg_index=1, tree_index=1, item=Stiffeners 
arg_index=2, tree_index=0, item=Stiffener 1 
Trying tree index: [0, 1, 2] 
arg_index=0, tree_index=0, item=root 
arg_index=1, tree_index=1, item=Stiffeners 
arg_index=2, tree_index=2, item=Add stiffener 
Trying tree index: [0, 1, 8] 
arg_index=0, tree_index=0, item=root 
arg_index=1, tree_index=1, item=Stiffeners 
list index out of range 

一大醇'的警告,我沒有在實踐中使用這個,但因爲我沒有看到你的帖子之前的想法剛纔。但是我一起黑了,我很想看看我能否替代我的項目過於複雜的方法。

+0

這看起來很有希望!我是否正確理解你寫的函數返回給定的索引的項目?我看起來像給所有的父母一樣,是否有可能給這個項目提供索引的索引?並且可以使用item.GetPyData ['data']獲取我想要的數據,對嗎? 順便說一句,有趣的是,看你可能能夠在你自己的項目中使用它! –

+0

它返回'GenericTreeItem'實例;上面的輸出來自我留下的調試打印。在示例代碼中,我忽略了'get_item_by_indexes'的返回值,但您可以使用它。 – robm

+0

當然啊,應該已經注意到了。將看看我是否可以應用這個。順便說一句,我會upvote你的帖子,但沒有足夠的聲譽,所以如果我得到另一個upvote你會得到第一upvote我會給。 –