github上代码还是更新不上去,在push的时候总是报Everything up-to-date 两天了居然还没搞定这个问题- -羞愧到死,求破
PS.写在前面:下篇的大部分都来自于WxPythonInAction/ChapterFifteen树形控件
我是觉得对我这样的菜鸟来说是没有任何理由不去把WxPythonInAction多看几次
在这一篇里,我自己‘研究’了怎么给树添加自定义图标,在源码中寻找方法的过程让我获益良多,这是原来使用C#时不曾有的感觉
另外感谢屠龙刀砍柴郎的网易博客他向我们展示了所有wxpython中可直接调用的图标
wxPython的树wx.TreeCtrl
树控件即使不是最重要的控件之一也应该是之二之三吧o(╯□╰)o,wx.TreeCtrl好不好用,功能强不强大什么的,我个小菜鸟也不懂,我是觉得最方便好使的还是C#的TreeView,不过比起Flex的mx:Tree来说,还是挺好用的。
给程序添加一颗树
一棵树最基本的功能:1、展示数据,2、被选中时读出数据,先实现这俩功能先
class myFrame(wx.Frame):
def __init__(self,parent,title,size):
wx.Frame.__init__(self,parent,-1,title,size = size)
_layout = layout(self)
_layout.layoutBuild()
self.winUp = _layout.windows[0][0]
self.winUp.SetBackgroundColour('green')
self.winDown = _layout.windows[0][1]
self.winDown.SetBackgroundColour('yellow')
self.winLeft = _layout.windows[1][0]
self.winLeft.SetBackgroundColour('red')
self.winRight = _layout.windows[1][1]
self.winRight.SetBackgroundColour('pink')
#tree
self.tree = wx.TreeCtrl(self.winLeft,id = -1,pos=(0,0),size=self.winLeft.Size)
rootdata = wx.TreeItemData('记录')
root = self.tree.AddRoot('记录',data = rootdata)
'''
data = ['a',
'b',
'c',
['d',
['D','DD']],
'e']
'''
itemsdata = {'0':{'label':'a','data':'this is a','notes':'note : this is a'},
'1':{'label':'b','data':'this is b','notes':'note : this is b'},
'2':[{'label':'c','data':'this is c','notes':'note : this is c'},
{'label':'C','data':'this is C','notes':'note : this is C'}]}
#self.AddTreeNodes(root, data)
self.appendTreeNodes(root, itemsdata)
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeSelChanged)
#notebook
self.notebook = wx.Notebook(self.winRight,id = -1,pos = (0,0),size = self.winRight.Size)
self.txtwork = wx.TextCtrl(self.notebook)
self.notebook.AddPage(self.txtwork,'workspace',True)
#menu bar
menuO = jcc.menuOpera(self)
menuO.menubarBuild(None)
#status bar
statusBar = self.CreateStatusBar()
def OnTreeSelChanged(self,event):
treeitemid = event.GetItem()
print self.GetItemText(treeitemid)
def GetItemText(self,item):
if item:
return self.tree.GetItemData(item).GetData()
else:
return ''
def appendTreeNodes(self,parentItem,itemsdata):
for key in itemsdata:
val = itemsdata[key]
if type(val) is types.DictionaryType:
self._appendTreeNode(parentItem,val)
elif type(val) is types.ListType:
data = wx.TreeItemData(key)
item = self.tree.AppendItem(parentItem,key,data = data)
for v in val:
self._appendTreeNode(item,v)
def _appendTreeNode(self,parentItem,itemdata):
datastr = itemdata['data']
label = itemdata['label']
notes = itemdata['notes']
itemdata = wx.TreeItemData(datastr)
item = self.tree.AppendItem(parentItem,label,data=itemdata)
notedata = wx.TreeItemData(notes)
self.tree.AppendItem(item,notes,data = notedata)
def AddTreeNodes(self,parentItem,items):
for item in items:
if type(item) is types.StringType:
data = wx.TreeItemData(obj = item)
print data.GetData()
self.tree.AppendItem(parentItem,item,data = data)
else:
newItem = self.tree.AppendItem(parentItem,item[0])
self.AddTreeNodes(newItem, item[1])
wx.TreeItem在创建的时候可以选择传入一个TreeItemData,如果不传的话默认会是None,TreeItemData实质上是一个pyObject,因此可以是任何东西,在这里为了方便练习,使用了str。
TreeEvent的属性
当我们点击树中某个节点的时候,触发了wx.EVT_TREE_SEL_CHANGED事件,这个事件属于TreeEvent,TreeEvent有以下几个方法,当然有Get的都会有Set。
GetKeyCode() | 返回所按键的整数按键码。只对wx.EVT_TREE_KEY_DOWN事件类型有效。如果任一修饰键(CTRL,SHIFT,and ALT之类的)也被按下,该属性不会告知你。 |
GetItem() | 返回与事件相关的项的wx.TreeItemId。 |
GetKeyEvent() | 只对wx.EVT_TREE_KEY_DOWN事件有效。返回wx.KeyEvent。该事件可以被用来告知你在该事件期间,是否有修饰键被按下。 |
GetLabel() | 返回项目的当前文本标签。只对wx.EVT_TREE_BEGIN_LABEL_EDIT和wx.EVT_TREE_END_LABEL_EDIT有效。 |
GetPoint() | 返回与该事件相关的鼠标位置的一个wx.Point。只对拖动事件有效。 |
IsEditCancelled() | 只对wx.EVT_TREE_END_LABEL_EDIT有效。如果用户通过取消来结束当前的编辑则返回True,否则返回False。 |
SetToolTip(tooltip) | 只对wx.EVT_TREE_ITEM_GETTOOLTIP事件有效。这使你能够得到关于项目的提示。该属性只作在Windows系统上。 |
TreeCtrl的方法
其中最常用的我认为是GetItem(),根据GetItem返回的id,就可以在wx.TreeCtrl下操作TreeItem了,具体有在本例里则使用到了GetItemData()和GetItemText()
def GetItemText(*args, **kwargs):
"""GetItemText(self, TreeItemId item) -> String"""
return _controls_.TreeCtrl_GetItemText(*args, **kwargs)
def GetItemImage(*args, **kwargs):
"""GetItemImage(self, TreeItemId item, int which=TreeItemIcon_Normal) -> int"""
return _controls_.TreeCtrl_GetItemImage(*args, **kwargs)
def GetItemData(*args, **kwargs):
"""GetItemData(self, TreeItemId item) -> TreeItemData"""
return _controls_.TreeCtrl_GetItemData(*args, **kwargs)
def GetItemPyData(*args, **kwargs):
"""GetItemPyData(self, TreeItemId item) -> PyObject"""
return _controls_.TreeCtrl_GetItemPyData(*args, **kwargs)
GetPyData = GetItemPyData
def GetItemTextColour(*args, **kwargs):
"""GetItemTextColour(self, TreeItemId item) -> Colour"""
return _controls_.TreeCtrl_GetItemTextColour(*args, **kwargs)
def GetItemBackgroundColour(*args, **kwargs):
"""GetItemBackgroundColour(self, TreeItemId item) -> Colour"""
return _controls_.TreeCtrl_GetItemBackgroundColour(*args, **kwargs)
def GetItemFont(*args, **kwargs):
"""GetItemFont(self, TreeItemId item) -> Font"""
return _controls_.TreeCtrl_GetItemFont(*args, **kwargs)
def GetItemState(*args, **kwargs):
"""GetItemState(self, TreeItemId item) -> int"""
return _controls_.TreeCtrl_GetItemState(*args, **kwargs)
def SetItemText(*args, **kwargs):
"""SetItemText(self, TreeItemId item, String text)"""
return _controls_.TreeCtrl_SetItemText(*args, **kwargs)
def SetItemImage(*args, **kwargs):
"""SetItemImage(self, TreeItemId item, int image, int which=TreeItemIcon_Normal)"""
return _controls_.TreeCtrl_SetItemImage(*args, **kwargs)
def SetItemData(*args, **kwargs):
"""SetItemData(self, TreeItemId item, TreeItemData data)"""
return _controls_.TreeCtrl_SetItemData(*args, **kwargs)
def SetItemPyData(*args, **kwargs):
"""SetItemPyData(self, TreeItemId item, PyObject obj)"""
return _controls_.TreeCtrl_SetItemPyData(*args, **kwargs)
SetPyData = SetItemPyData
def SetItemHasChildren(*args, **kwargs):
"""SetItemHasChildren(self, TreeItemId item, bool has=True)"""
return _controls_.TreeCtrl_SetItemHasChildren(*args, **kwargs)
def SetItemBold(*args, **kwargs):
"""SetItemBold(self, TreeItemId item, bool bold=True)"""
return _controls_.TreeCtrl_SetItemBold(*args, **kwargs)
def SetItemDropHighlight(*args, **kwargs):
"""SetItemDropHighlight(self, TreeItemId item, bool highlight=True)"""
return _controls_.TreeCtrl_SetItemDropHighlight(*args, **kwargs)
def SetItemTextColour(*args, **kwargs):
"""SetItemTextColour(self, TreeItemId item, Colour col)"""
return _controls_.TreeCtrl_SetItemTextColour(*args, **kwargs)
def SetItemBackgroundColour(*args, **kwargs):
"""SetItemBackgroundColour(self, TreeItemId item, Colour col)"""
return _controls_.TreeCtrl_SetItemBackgroundColour(*args, **kwargs)
def SetItemFont(*args, **kwargs):
"""SetItemFont(self, TreeItemId item, Font font)"""
return _controls_.TreeCtrl_SetItemFont(*args, **kwargs)
def SetItemState(*args, **kwargs):
"""SetItemState(self, TreeItemId item, int state)"""
return _controls_.TreeCtrl_SetItemState(*args, **kwargs)
def IsVisible(*args, **kwargs):
"""IsVisible(self, TreeItemId item) -> bool"""
return _controls_.TreeCtrl_IsVisible(*args, **kwargs)
def ItemHasChildren(*args, **kwargs):
"""ItemHasChildren(self, TreeItemId item) -> bool"""
return _controls_.TreeCtrl_ItemHasChildren(*args, **kwargs)
def IsExpanded(*args, **kwargs):
"""IsExpanded(self, TreeItemId item) -> bool"""
return _controls_.TreeCtrl_IsExpanded(*args, **kwargs)
def IsSelected(*args, **kwargs):
"""IsSelected(self, TreeItemId item) -> bool"""
return _controls_.TreeCtrl_IsSelected(*args, **kwargs)
def IsBold(*args, **kwargs):
"""IsBold(self, TreeItemId item) -> bool"""
return _controls_.TreeCtrl_IsBold(*args, **kwargs)
给树添加图标
wxPython有很多的已定义的图标,具体有哪些请看下图(图片来源屠龙刀砍柴郎的网易博客)
具体怎么添加图标在这里不写,看完下一段添加自定义图标其实也就懂了,如果不了解请参看http://wiki.woodpecker.org.cn/moin/WxPythonInAction/ChapterFifteen例15.2
给树添加自定义图标
怎么给树添加自定义图标呢?网上似乎没有讨论这个的,其实也很简单,代码中写了注释。
重点是需要注意到要想给树一个图标,首先得给树分配图片列表AssignImageList,其次才是获得本地图片。还有一点需要注意的就是setItemImage的第二个参数实际上是int型的,也就是说其实需要的是图片在图片列表中的索引
class myFrame(wx.Frame):
def __init__(self,parent,title,size):
wx.Frame.__init__(self,parent,-1,title,size = size)
_layout = layout(self)
_layout.layoutBuild()
self.winUp = _layout.windows[0][0]
self.winUp.SetBackgroundColour('green')
self.winDown = _layout.windows[0][1]
self.winDown.SetBackgroundColour('yellow')
self.winLeft = _layout.windows[1][0]
self.winLeft.SetBackgroundColour('red')
self.winRight = _layout.windows[1][1]
self.winRight.SetBackgroundColour('pink')
#tree
self.tree = wx.TreeCtrl(self.winLeft,id = -1,pos=(0,0),size=self.winLeft.Size)
rootdata = wx.TreeItemData('记录')
root = self.tree.AddRoot('记录',data = rootdata)
'''
data = ['a',
'b',
'c',
['d',
['D','DD']],
'e']
'''
itemsdata = {'0':{'label':'a','data':'this is a','notes':'note : this is a'},
'1':{'label':'b','data':'this is b','notes':'note : this is b'},
'2':[{'label':'c','data':'this is c','notes':'note : this is c'},
{'label':'C','data':'this is C','notes':'note : this is C'}]}
imglist = wx.ImageList(16,16)#创建一个图片大小16*16的列表
img = wx.Image('assets/edit.png',type = wx.BITMAP_TYPE_PNG)#获得本地图片
self.bmp = imglist.Add(img.ConvertToBitmap())#通过ConvertToBitmap()方法转成bitmap并添加到图片列表中,别忘了把值赋给self.bmp,
#请注意,self.bmp的值是int
self.tree.AssignImageList(imglist)#给树分配图片列表
#self.AddTreeNodes(root, data)
self.appendTreeNodes(root, itemsdata)
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTreeSelChanged)
#notebook
self.notebook = wx.Notebook(self.winRight,id = -1,pos = (0,0),size = self.winRight.Size)
self.txtwork = wx.TextCtrl(self.notebook)
self.notebook.AddPage(self.txtwork,'workspace',True)
#menu bar
menuO = jcc.menuOpera(self)
menuO.menubarBuild(None)
#status bar
statusBar = self.CreateStatusBar()
def OnTreeSelChanged(self,event):
treeitemid = event.GetItem()
print self.GetItemText(treeitemid)
def GetItemText(self,item):
if item:
return self.tree.GetItemData(item).GetData()
else:
return ''
def appendTreeNodes(self,parentItem,itemsdata):
for key in itemsdata:
val = itemsdata[key]
if type(val) is types.DictionaryType:
self._appendTreeNode(parentItem,val)
elif type(val) is types.ListType:
data = wx.TreeItemData(key)
item = self.tree.AppendItem(parentItem,key,data = data)
for v in val:
self._appendTreeNode(item,v)
def _appendTreeNode(self,parentItem,itemdata):
datastr = itemdata['data']
label = itemdata['label']
notes = itemdata['notes']
itemdata = wx.TreeItemData(datastr)
item = self.tree.AppendItem(parentItem,label,data=itemdata)
self.tree.SetItemImage(item,self.bmp)#设置图标
notedata = wx.TreeItemData(notes)
self.tree.AppendItem(item,notes,data = notedata)
def AddTreeNodes(self,parentItem,items):
for item in items:
if type(item) is types.StringType:
data = wx.TreeItemData(obj = item)
print data.GetData()
self.tree.AppendItem(parentItem,item,data = data)
else:
newItem = self.tree.AppendItem(parentItem,item[0])
self.AddTreeNodes(newItem, item[1])
