繁体   English   中英

wxPython TreeCtrl:通过索引获取一个treeitem的数据

[英]wxPython TreeCtrl: Get an treeitem's data by index

如何通过树的索引获取树项的数据?

我目前正在使用wxPython(使用Python 2.7)编写GUI。 该GUI包含一个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],依此类推。

我已经寻找了一段时间,希望有人可以帮助我。 提前致谢!

我继承了一个项目,该项目采用非常复杂的方式来完成您要的内容,但是您的帖子给了我一个新的主意。 从概念上讲,我认为您在此示例中谈论的是与get_item_by_indexes方法类似的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

我还没有在实践中使用过这个警告,因为我在看到您的帖子之前还没有这个主意。 但是我一起破解了这个,我很想知道我是否可以替换项目中过于复杂的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM