wxPython - Interfaccia a più documenti

Una tipica applicazione GUI può avere più finestre. I widget a schede e in pila consentono di attivare una di queste finestre alla volta. Tuttavia, molte volte questo approccio potrebbe non essere utile poiché la visualizzazione di altre finestre è nascosta.

Un modo per visualizzare più finestre contemporaneamente è crearle come finestre indipendenti. Questo si chiama SDI (Single Document Interface). Ciò richiede più risorse di memoria poiché ogni finestra può avere il proprio sistema di menu, barra degli strumenti, ecc.

Il framework MDI in wxPython fornisce una classe wx.MDIParentFrame. Il suo oggetto funge da contenitore per più finestre figlie, ciascuna delle quali è un oggetto della classe wx.MDIChildFrame.

Le finestre figlio risiedono nell'area MDIClientWindow del frame padre. Non appena viene aggiunto un frame figlio, la barra dei menu del frame padre mostra un menu Finestra contenente pulsanti per disporre i figli in modo a cascata o affiancato.

Esempio

L'esempio seguente illustra gli usi di MDIParentFrame come finestra di primo livello. Un pulsante Menu chiamato NewWindow aggiunge una finestra figlia nell'area client. È possibile aggiungere più finestre e quindi disporre in un ordine a cascata o affiancato.

Il codice completo è il seguente:

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()

Il codice precedente produce il seguente output: