wxPython的wx.TreeCtrl是wxWidgets的wxTreeCtrl的Python封装,所以下面在讨论的时候可能会在两个版本之间有所重叠,由于用词的不同,应该可以区分开来。我是从wxWidgets的帮助文档中获得信息的,但是尽量使用wxPython中的术语来进行陈述,但是有些地方我还没有在wxPython当中使用过,所以这些地方将使用wxWidgets的说法(会有所说明)。
wx.TreeCtrl当中的所有节点都是通过一个TreeItemId来索引的。假如a是这样的一个TreeItemId,那么可以用a.IsOk()来判断这个TreeItemId在这个TreeCtrl当中是否有效。
创建TreeCtrl时的样式选择:
wx.TR_EDIT_LABELS | 如果想让节点标签使用的文字可以修改,那么请使用这个样式。 |
wx.TR_NO_BUTTONS | 这种样式在各个节点左边不会显示箭头或者带方框的小加号(用于标识该节点是否有子节点,该节点是否已经展开等信息)等可以点击的小按钮。 |
wx.TR_HAS_BUTTONS | 与上面一个正好相反。是惯常使用的样式。 |
wx.TR_NO_LINES | 不显示左边链接兄弟节点的那根虚线(vertical level connector)。 |
wx.TR_FULL_ROW_HIGHLIGHT | 让被选中的节点所在的行整个高亮显示(在Windows下会被忽略,除非你同时使用了wx.TR_NO_LINES。 |
wx.TR_LINES_AT_ROOT | 显示连接root节点的连线,只有当使用了wx.TR_HIDE_ROOT,并且没有使用wx.TR_NO_LINES的时候有效。 |
wx.TR_HIDE_ROOT | 不显示root节点,root节点的子节点被显示为root节点。 |
wx.TR_ROW_LINES | 针对选中的行显示一个边框。Use this style to draw a contrasting border between displayed rows. |
wx.TR_HAS_VARIABLE_ROW_HEIGHT | 这个样式让所有行的行高设置为刚好容纳给行的内容。如果没使用这个样式,那么所有行的行高都设为其中需要的最高行高。默认没有使用这个样式。 |
wx.TR_SINGLE | 只能选中一个节点,默认使用。 |
wx.TR_MULTIPLE | 允许选中多个节点(应当是连续的)。 |
wx.TR_EXTENDED | 允许选中多个不连续的节点(部分实现,不一定在所有情况下都工作)。 |
wx.TR_DEFAULT_STYLE | 针对本地系统自动设置的最接近本地显示方案的一组样式。 |
如何判断被选中的节点是否是叶节点?得到被选中节点的TreeCtrlId,比如是a。那么a.GetLastChild()将会返回该节点的最后一个子节点的TreeCtrlId,如果没有子节点,将返回一个无效的TreeCtrlId。这样,通过检查这个返回的TreeCtrlId是否有效就可以知道这个节点是否是叶节点。
wx.TreeCtrl.AppendItem()
其第一个参数为父节点的TreeItemId,如果是根节点当然没有父节点,所有有另外一个函数wx.TreeCtrl.AddRoot()来添加根节点。
第二个参数是显示在节点标签上的字符串。
返回值为一个TreeItemId。
AppendItem()返回的TreeItemId似乎没有什么用处啊,这个TreeItemId和当这个节点被选中的时候产生的TreeItemId不是同样的值啊……是不是应该用AppendItem()函数中的TreeItemData那个参数呢?
当创建了一个wx.TreeCtrl实例以后,你应当用AddRoot()来添加一个根节点,然后在这个根节点下面添加下一级节点,如此下去。不过根节点是只能添加一个的,不能添加第二次。那么当你想要一个看起来有多个并列根节点的树状控件的时候,你就应该使用样式wx.TR_HIDE_ROOT了,这能在视觉上满足你的要求。
wx.TreeCtrl.AddRoot( text, image=-1, selImage=-1, data=None)
两个关于image的参数是需要的图像在这个wx.TreeCtrl图像列表中的索引值。data参数指定了一个与根节点关联的对象,wxPython in action中说这最多起到排序的作用,而且如果是使用Python的话,会有一个更好的快捷方法实现相应的功能。函数返回一个对应root节点的ID。wx.TreeCtrl使用自己的类wx.TreeItemId来管理树中的items。我们不需要知道这些TreeItemId的具体值到底是多少,只要知道它们能够测试互相是否相等,这就完全够用了。wx.TreeItemId没有被映射到任何的简单类型,因为它的具体数值是完全没有意义的。
联系客服