[python]wxPython学习记录3

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_EDITwx.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]) 


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值