wxPython in Action (MDIParentFrame

  8.3 可选的框架类型

框架不限于其中带有窗口部件的普通的矩形,它可以呈现其它的形状。你也可以创建MDI(多文档界面)框架,它其中包含别的框架。或者你也可以去掉框架的标题栏,并且仍然可以使用户能拖动框架。

8.3.1 如何创建一个MDI框架?

还记得MDI吗?许多人都不记得了。MDI是微软90年代初的创新,它使得一个应用程序中的多个子窗口能被一个单一的父窗口控制,本质上为每个应用程序提供了一个独立的桌面。在大多数应用程序中,MDI要求应用程序中的所有窗口同时最小化,并保持相同的z轴次序(相对系统中的其它部分)。我们建议仅当用户期望同时看到所有的应用程序窗口的情况下使用MDI,例如一个游戏。图8.7显示了一个典型的MDI环境。

在wxPython中MDI是被支持的,在Windows操作系统下通过使用本地窗口部件来实现MDI,在其它的操作系统中通过模拟子窗口实现MDI。例8.8提供了一简单的MDI的例子。

图8.7


例8.8 如何创建一个MDI窗口

import  wx

class  MDIFrame(wx.MDIParentFrame):
        def  __init__(self):
                wx.MDIParentFrame.__init__(self,  None,  -1,  "MDI  Parent", 
                                size=(600,400))
                menu  =  wx.Menu()
                menu.Append(5000,  "&New  Window")
                menu.Append(5001,  "E&xit")
                menubar  =  wx.MenuBar()
                menubar.Append(menu,  "&File")
                self.SetMenuBar(menubar)
                self.Bind(wx.EVT_MENU,  self.OnNewWindow,  id=5000)
                self.Bind(wx.EVT_MENU,  self.OnExit,  id=5001)

        def  OnExit(self,  evt):
                self.Close(True)

        def  OnNewWindow(self,  evt):
                win  =  wx.MDIChildFrame(self,  -1,  "Child  Window")
                win.Show(True)

if  __name__  ==  '__main__':
        app  =  wx.PySimpleApp()
        frame  =  MDIFrame()
        frame.Show()
        app.MainLoop()
               
MDI的基本概念是十分简单的。父窗口是wx.MDIParentFrame的一个子类,子窗口如同任何其它的wxPython窗口部件一样被添加,除了它们是wx.MDIChildFrame的子类。wx.MDIParentFrame的构造函数与wx.Frame的基本相同,如下所示:

wx.MDIParentFrame(parent,  id,  title,  pos  =  wx.DefaultPosition, 
                size=wxDefaultSize, 
                style=wx.DEFAULT_FRAME_STYLE  |  wx.VSCROLL  |  wx.HSCROLL, 
                name="frame")

不同的一点是wx.MDIParentFrame在默认情况下有滚动条。wx.MDIChildFrame的构造函数是相同的,除了它没有滚动条。如例8.8所示,添加一个子框架是通过创建一个以父框架为父亲的框架来实现的。

你可以通过使用父框架的Cascade()或Tile()方法来同时改变所有子框架的位置和尺寸,它们模拟相同名字的菜单项。调用Cascade(),导致一个窗口显示在其它的上面,如图8.7的所示,而Tile()使每个窗口有相同的尺寸并移动它们以使它们不重叠。要以编程的方式在子窗口中移动焦点,要使用父亲的方法ActivateNext()和ActivatePrevious()

8.3.2 什么是小型框架,我们为何要用它?

小型框架是一个有两个例外的矩形框架:它有一个较小的标题区域,并且在微软的Windows下或GTK下,它不在任务栏中显示。图8.8显示了一个较小标题域的一个例子。

图8.8 一个小型框架


创建小型框架的代码基本上等同于创建一个矩形框架,唯一的不同是父类是wx.MiniFrame。例8.9显示了这个代码。

例8.9 创建一个小型框架

import  wx

class  MiniFrame(wx.MiniFrame):
        def  __init__(self):
                wx.MiniFrame.__init__(self,  None,  -1,  'Mini  Frame', 
                                size=(300,  100))
                panel  =  wx.Panel(self,  -1,  size=(300,  100))
                button  =  wx.Button(panel,  -1,  "Close  Me",  pos=(15,  15))
                self.Bind(wx.EVT_BUTTON,  self.OnCloseMe,  button)
                self.Bind(wx.EVT_CLOSE,  self.OnCloseWindow)

        def  OnCloseMe(self,  event):
                self.Close(True)

        def  OnCloseWindow(self,  event):
                self.Destroy()

if  __name__  ==  '__main__':
        app  =  wx.PySimpleApp()
        MiniFrame().Show()
        app.MainLoop() 

wx.MiniFrame的构造函数等同于wx.Frame的,然而,wx.MiniFrame支持额外的样式标记。如表8.8所示。

表8.8 wx.MiniFrame的样式标记

wx.THICK_FRAME:在Windows或Motif下,使用粗边框绘制框架。

wx.TINY_CAPTION_HORIZONTAL:代替wx.CAPTION而显示一个较小的水平标题。

wx.TINY_CAPTION_VERTICAL:代替wx.CAPTION而显示一个较小的垂直标题。

典型的,小型框架被用于工具框窗口中,在工具框窗口中始终是有效的,它们不影响任务栏。较小的标题使得它们更有效的利用空间,并且明显地区别于标准的框架。


你可能感兴趣的:(wxPython in Action (MDIParentFrame)