• wxPython应用:TreeBook构建小型管理系统


    我这里说的小型管理系统如图:

    image

    可以点击菜单,右边的窗体相应出现不同的内容,小型应用够了,完整代码:

    #coding:utf-8
    '''
    Created on 2011-8-26
    @author: walker
    '''
    import  wx    
        
    class TestTB(wx.Treebook):
        def __init__(self, parent, id):
            wx.Treebook.__init__(self, parent, id, style=wx.BK_DEFAULT)
            idGenerator=self.getNextID(50)#实例化生成器
            first=True
            panlist=self.getPageList()#得到目录列表
            for x in panlist:
                for k,v in x.items():
                    win=self.makeDemoPanel()#父页面
                    self.AddPage(win,k,imageId=idGenerator.next())
                    if first:
                        first=False
                    else:
                        for sub in v:
                            win=sub[1]
                            self.AddSubPage(win,sub[0],imageId=idGenerator.next())
                            #由上面的例子可以看出,父/子页面关系完全由添加的顺序而定
                            #即你AddPage后AddSubPage,一定是刚才这个Page所对应的菜单的子菜单的页面,
                            #所以看不到设“父目录”的代码
    
            self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGED, self.OnPageChanged)
            self.Bind(wx.EVT_TREEBOOK_PAGE_CHANGING, self.OnPageChanging)
    
            # This is a workaround for a sizing bug on Mac...
            wx.FutureCall(100, self.AdjustSize)
    
        def getNextID(self,count):
            '''一个ID生成器'''
            imID = 0
            while True:
                yield imID
                imID += 1
                if imID == count:
                    imID = 0
                    
        def AdjustSize(self):
            self.GetTreeCtrl().InvalidateBestSize()
            self.SendSizeEvent()
            
    
        def makeDemoPanel(self,type=None):
            p = wx.Panel(self, -1)#子窗体的容器
            win=wx.Panel(p,-1)#子窗体容器包含的页面,此处我还是用了一个panel
            wx.StaticText(win,-1,type or "parnet")#此两句,在项目中用的时候应该包装出去,因为你的窗体可能非常复杂,而不是像我现在演示的这样仅仅只有一个Label
            p.win = win
            def OnCPSize(evt, win=win):
                win.SetPosition((0,0))
                win.SetSize(evt.GetSize())
            p.Bind(wx.EVT_SIZE, OnCPSize)
            return p
        
        def getPageList(self):
            '''我是以父目录为键名,子目录List为键值来保存本示例的菜单数据
              同时,子目录列表的结构为(子目录名,对应窗体对象)的元组,这样每次生成tree的子目录的时候,可以直接把窗体对象AddSubPage进去
            '''
            return [
                {'根节点                   ':[]},
                {'一级目录1':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                {'一级目录2':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                {'一级目录3':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                {'一级目录4':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                {'一级目录5':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                {'一级目录6':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                {'一级目录7':[('二级目录一',self.makeDemoPanel('内页1')),('二级目录二',self.makeDemoPanel('内页2')),('二级目录三',self.makeDemoPanel('内页3')),('二级目录四',self.makeDemoPanel('内页4')),]},  
                ]
    
    
        def OnPageChanged(self, event):
            '''演示捕捉页面切换事件'''
            old = event.GetOldSelection()
            new = event.GetSelection()
            sel = self.GetSelection()
            print 'OnPageChanged,  old:%d, new:%d, sel:%d\n' % (old, new, sel)
            event.Skip()
    
        def OnPageChanging(self, event):
            '''演示捕捉页面切换事件'''
            old = event.GetOldSelection()
            new = event.GetSelection()
            sel = self.GetSelection()
            print 'OnPageChanging, old:%d, new:%d, sel:%d\n' % (old, new, sel)
            event.Skip()
    
    def main():
        app=wx.App()#实际化应用
        frame=wx.Frame(None,-1,"my tree book demo")#实例化窗体
        
        def onExitApp(evt):
            '''退出的方法'''
            frame.Close(True)
        menuBar=wx.MenuBar()#顺便生成一个菜单,含有“退出”功能
        menu=wx.Menu()
        item=menu.Append(-1,"Exit\tCtrl-Q","Exit")
        frame.Bind(wx.EVT_MENU,onExitApp,item)
        frame.SetMenuBar(menuBar)
        
        menuBar.Append(menu,"&File")
        win=TestTB(frame,-1)#生成TreeBook
        if win:
            frame.SetSize((800,600))
            frame.Centre()
            frame.Show()
            win.SetFocus()
            frame.window=win#设置TreeBook控件为主窗体对象(其实我还是不明白frame对象的window属性有什么特权)
        else:
            frame.Destory()
        app.MainLoop()#进入主消息循环
        
    if __name__ == '__main__':
        main()

    用TreeBook来做菜单两个限制:

    1,只能生成两级菜单(AddPage和AddSubPage两个命令分别对应两级)

    2,不能改变左栏的宽度,宽度貌似由第一个节点的宽度所确定,所以本例中我用了很多空格把根节点的文字变得很长

  • 相关阅读:
    如何从你的缓存分析全世界
    Java Collection Framework概述
    用Reveal分析第三方App的UI
    三种经典iPhone上网络抓包方法详解
    HTTPS时代全面到来,你准备好了吗?
    从“埋点技术已死?”开始说起
    访客至上的Web、移动可用性设计--指导原则
    动画原理——图形填充
    动画原理——曲线
    动画原理——绘画API
  • 原文地址:https://www.cnblogs.com/walkerwang/p/2155093.html
Copyright © 2020-2023  润新知