wxPython官方文档中文翻译 - TreeCtrl概述

90 阅读4分钟

官方文档:docs.wxpython.org/treectrl_ov…

树控件以类似树状的结构显示其项目。每个项目都有自己的(可选的)图标和一个标签。一个项目可以处于折叠状态(这意味着它的子项不可见),也可以处于展开状态(这意味着它的子项会显示出来)。树中的每个项目都由其项目ID标识,该项目ID属于不透明数据类型wx.TreeItemId。你可以通过调用wx.TreeItemId.IsOk来测试一个项目是否有效。

项目的文本和图像可以通过 (Get|Set)ItemText以及 (Get|Set)ItemImage来检索和更改。实际上,一个项目甚至可能关联有两张图像:一张是正常状态下的图像,另一张是用于选中状态的图像,可通过 (Get|Set)ItemSelectedImage函数来设置或检索这张图像,但此功能在某些平台上可能不可用。

树项目具有几个属性:一个项目可能处于选中状态或未选中状态、可见或不可见、加粗显示或未加粗显示。它还可能处于展开或折叠状态。所有这些属性都可以通过相应的函数来检索:wx.TreeCtrl.IsSelectedwx.TreeCtrl.IsVisiblewx.TreeCtrl.IsBold以及wx.TreeCtrl.IsExpanded。一次只能选中一个项目,(使用wx.TreeCtrl.SelectItem)选中另一个项目会自动取消对之前选中项目的选择。

除了其图标和标签之外,一个特定于用户的数据结构可以与所有树项目相关联。如果你希望这样做,你应该从wx.TreeItemData派生一个类,wx.TreeItemData是一个非常简单的类,它只有一个函数GetId() ,该函数返回与此数据相关联的项目的ID。当相关联的项目被删除时(当控件被销毁时,所有项目都会被删除),此数据将由控件自身释放,所以你不应该自行删除它(如果你自行删除了,你应该调用SetItemData(None) 以防止树状控件再次删除该指针)。可以使用wx.TreeCtrl.GetItemData函数来检索相关联的数据。

如果所有项目都在树创建时就添加到树中,那么操作树相对来说是比较直接明了的。然而,对于大型树状结构而言,这样做可能效率非常低。为了提高性能,你可能希望推迟将项目添加到树中,直到包含这些项目的分支被展开时再进行添加:因此,一开始,只需创建根项目(使用wx.TreeCtrl.AddRoot)。当接收到wx.EVT_TREE_ITEM_EXPANDING事件时,再添加其他项目:此时,应添加直接位于正在展开的项目之下的所有项目,当然,只有在针对该项目首次接收到此事件时才进行添加——否则,如果用户展开、折叠然后再次展开该分支,这些项目就会被添加两次。

树控件提供了用于枚举其项目的函数。共有三组枚举函数:一组用于枚举给定项目的子项,一组用于枚举给定项目的兄弟项,还有一组用于枚举可见项目(即当前显示给用户的项目:一个项目可能不可见,原因可能是其所在分支处于折叠状态,或者是它被滚动到视图之外了)。子项枚举函数要求调用者为其提供一个cookie参数:这是一个对调用者来说不透明的数字,但树控件自身会使用它,以便能够同时运行多个枚举操作(这是明确允许的)。唯一需要记住的是,传递给wx.TreeCtrl.GetFirstChildwx.TreeCtrl.GetNextChildcookie应该是同一个变量(并且用户代码不应针对它进行任何操作)。

树控件的其他特性包括:

  • 使用wx.TreeCtrl.SortChildren进行项目排序,该方法会调用用户自定义的比较函数OnCompareItems(默认情况下,比较是基于树项目标签的字母顺序比较);
  • 使用wx.TreeCtrl.HitTest进行命中测试(确定给定的点属于控件的哪个部分,这对于在树控件中实现拖放功能很有用);
  • 就地编辑树项目标签(请参阅wx.TreeCtrl.EditLabel)。

最后,树控件还具备键盘操作界面:可以使用光标导航键(箭头键)来更改当前的选中项。HOME键和END键用于跳转到当前项目的第一个/最后一个兄弟项。+键、-键和*键分别用于展开、折叠和切换当前分支。不过需要注意的是,默认情况下DEL键和INS键不会执行任何操作,但通常会将它们与从树中删除项目以及在树中插入新项目的操作关联起来。

另请参阅:wx.TreeCtrlwx.ImageList