<h1>wxPythoninAction(144)-水滴</h1><divstyle="float:left;margin:10px;"></div><strong>15 树形控件(tree control)</strong><br/><br/>本章内容<br/><br/><spanstyle="color:LimeGreen">* 创建树形控件并添加项目<br/>* 使用样式来设计树形控件<br/>* 在程序中访问树形控件<br/>* 处理树形控件中的选择<br/>* 控制项目的可见性</span><br/><br/>树形控件是用于显示复杂数据的控件。这里,树形控件被设计用来通过分级层来显示数据,你可以看到每<br/>块数据都有父子方面的东西。一个标准的例子就是文件树,其中的目录中有子目录或文件,从而形成了文<br/>件的一个嵌套的层次。另一个例子是HTML或XML文档的文档对象模型(DOM)树。和列表与网格控件一样,树<br/>形控件也提供了在项目显示方面的灵活性,并允许你就地编辑树形控件中的项目。在这一章中,我们将给<br/>你展示如何编辑树形控件中的项目及如何响应用户事件。<br/><br/><strong>15.1 创建树形控件并添加项目</strong><br/><br/>树形控件是类wx.TreeCtrl的实例。图15.1显示了一个树形控件的样例。<br/><br/><strong>图15.1</strong><br/><imgsrc="http://www.pythontik.com/picture/blogpic/w15.1.gif"border="0"alt=""/><br/><br/>例15.1是产生图15.1的代码。这个例子中的机制我们将在后面的部分讨论。注意其中的树形控件中的数据<br/>是来自于一个名为data.py外部文件的。<br/><br/><strong>例15.1 树形控件示例</strong><br/><br/>import wx<br/>import data<br/><br/>class TestFrame(wx.Frame):<br/> def __init__(self):<br/> wx.Frame.__init__(self, None, title="simple tree", size=(400,500))<br/><br/> # Create the tree<br/> self.tree = wx.TreeCtrl(self)<br/><br/> # Add a root node<br/> root = self.tree.AddRoot("wx.Object")<br/><br/> # Add nodes from our data set<br/> self.AddTreeNodes(root, data.tree)<br/><br/> # Bind some interesting events<br/> self.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded, self.tree)<br/> self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed, self.tree)<br/> self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged, self.tree)<br/> self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivated, self.tree)<br/><br/> # Expand the first level<br/> self.tree.Expand(root)<br/><br/><br/> def AddTreeNodes(self, parentItem, items):<br/> """<br/> Recursively traverses the data structure, adding tree nodes to<br/> match it.<br/> """<br/> for item in items:<br/> if type(item) == str:<br/> self.tree.AppendItem(parentItem, item)<br/> else:<br/> newItem = self.tree.AppendItem(parentItem, item[0])<br/> self.AddTreeNodes(newItem, item[1])<br/> <br/> def GetItemText(self, item):<br/> if item:<br/> return self.tree.GetItemText(item)<br/> else:<br/> return ""<br/> <br/> def OnItemExpanded(self, evt):<br/> print "OnItemExpanded: ", self.GetItemText(evt.GetItem())<br/> <br/> def OnItemCollapsed(self, evt):<br/> print "OnItemCollapsed:", self.GetItemText(evt.GetItem())<br/><br/> def OnSelChanged(self, evt):<br/> print "OnSelChanged: ", self.GetItemText(evt.GetItem())<br/><br/> def OnActivated(self, evt):<br/> print "OnActivated: ", self.GetItemText(evt.GetItem())<br/><br/><br/>app = wx.PySimpleApp(redirect=True)<br/>frame = TestFrame()<br/>frame.Show()<br/>app.MainLoop()<br/><br/>下面的wx.TreeCtrl的构造函数是一个典型的wxPython窗口部件构造函数:<br/><br/>wx.TreeControl(parent, id=-1, pos=wx.DefaultPosition, <br/> size=wx.DefaultSize, style=wx.TR_HAS_BUTTONS, <br/> validator=wx.DefaultValidator, name="treeCtrl") <br/><br/>其中的参数意义与通常的wx.Window对象相同。该构造函数提供给你了一个没有元素的空的树。<br/><br/><strong>另附data.py文件</strong>:<br/><br/><br/># Some sample data for the treectrl samples<br/><br/>tree = [<br/> "wx.AcceleratorTable",<br/> "wx.BrushList",<br/> "wx.BusyInfo",<br/> "wx.Clipboard",<br/> "wx.Colour",<br/> "wx.ColourData",<br/> "wx.ColourDatabase",<br/> "wx.ContextHelp",<br/> ["wx.DC", [<br/> "wx.ClientDC",<br/> ["wx.MemoryDC", [<br/> "wx.lib.colourchooser.canvas.BitmapBuffer",<br/> ["wx.BufferedDC", [<br/> "wx.BufferedPaintDC", ]]]],<br/><br/> "wx.MetaFileDC",<br/> "wx.MirrorDC",<br/> "wx.PaintDC",<br/> "wx.PostScriptDC