【问题标题】:wxPython TreeCtrl: Get an treeitem's data by indexwxPython TreeCtrl:按索引获取树项的数据
【发布时间】:2017-05-04 07:36:58
【问题描述】:

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

我目前正在使用 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] 等等。

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

【问题讨论】:

    标签: python python-2.7 wxpython treecontrol


    【解决方案1】:

    我继承了一个项目,该项目有一个非常复杂的方法来完成您的要求,但您的帖子给了我一个新的想法。从概念上讲,我认为您在谈论类似于此示例中的 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
    

    一个很大的警告,我还没有在实践中使用它,因为在刚刚看到你的帖子之前我没有这个想法。但是我把这个组合起来了,我有兴趣看看我是否可以替换我的项目过于复杂的方法。

    【讨论】:

    • 这看起来很有希望!我是否正确理解您编写的函数返回具有给定索引的项目?我看起来它也给了所有的父母,是否可以只给带有询问索引的项目?有了那个项目,我可以使用 item.GetPyData['data'] 来获取我想要的数据,对吧?顺便说一句,很高兴看到您可以在自己的项目中使用它!
    • 它返回GenericTreeItem 实例;上面的输出来自我留下的调试打印。在示例代码中,我忽略了get_item_by_indexes 的返回值,但您可以改用它。
    • 啊当然应该注意到了。看看我是否可以应用这个。顺便说一句,我会为你的帖子点赞,但还没有足够的声誉,所以如果我得到另一个点赞,你将获得我将给予的第一个点赞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2017-06-09
    相关资源
    最近更新 更多