wxPython - Interfaz de múltiples documentos

Una aplicación de GUI típica puede tener varias ventanas. Los widgets con pestañas y apilados permiten activar una de esas ventanas a la vez. Sin embargo, muchas veces este enfoque puede no ser útil ya que la vista de otras ventanas está oculta.

Una forma de mostrar varias ventanas simultáneamente es crearlas como ventanas independientes. Esto se llama SDI (Single Document Interface). Esto requiere más recursos de memoria ya que cada ventana puede tener su propio sistema de menú, barra de herramientas, etc.

El marco MDI en wxPython proporciona una clase wx.MDIParentFrame. Su objeto actúa como un contenedor para múltiples ventanas secundarias, cada una de las cuales es un objeto de la clase wx.MDIChildFrame.

Las ventanas secundarias residen en el área MDIClientWindow del marco principal. Tan pronto como se agrega un marco secundario, la barra de menú del marco principal muestra un menú Ventana que contiene botones para organizar los elementos secundarios en cascada o en mosaico.

Ejemplo

El siguiente ejemplo ilustra los usos de MDIParentFrame como ventana de nivel superior. Un botón de menú llamado NewWindow agrega una ventana secundaria en el área del cliente. Se pueden agregar varias ventanas y luego organizarlas en cascada o en mosaico.

El código completo es el siguiente:

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, "&Exit") 
      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) 
		
app = wx.App() 
frame = MDIFrame() 
frame.Show() 
app.MainLoop()

El código anterior produce la siguiente salida: