wxPython - Interface de plusieurs documents

Une application GUI typique peut avoir plusieurs fenêtres. Les widgets à onglets et empilés permettent d'activer une de ces fenêtres à la fois. Cependant, cette approche peut souvent ne pas être utile car la vue des autres fenêtres est masquée.

Une façon d'afficher plusieurs fenêtres simultanément consiste à les créer en tant que fenêtres indépendantes. C'est ce qu'on appelle SDI (Single Document Interface). Cela nécessite plus de ressources mémoire car chaque fenêtre peut avoir son propre système de menus, sa propre barre d'outils, etc.

Le framework MDI dans wxPython fournit une classe wx.MDIParentFrame. Son objet agit comme un conteneur pour plusieurs fenêtres enfants, chacune étant un objet de la classe wx.MDIChildFrame.

Les fenêtres enfants résident dans la zone MDIClientWindow du cadre parent. Dès qu'un cadre enfant est ajouté, la barre de menus du cadre parent affiche un menu Fenêtre contenant des boutons pour organiser les enfants en cascade ou en mosaïque.

Exemple

L'exemple suivant illustre les utilisations de MDIParentFrame comme fenêtre de niveau supérieur. Un bouton Menu appelé NewWindow ajoute une fenêtre enfant dans la zone client. Plusieurs fenêtres peuvent être ajoutées, puis organisées dans un ordre en cascade ou en mosaïque.

Le code complet est le suivant -

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

Le code ci-dessus produit la sortie suivante -