wxPython - Schnittstelle für mehrere Dokumente
Eine typische GUI-Anwendung kann mehrere Fenster haben. Mit Registerkarten und gestapelten Widgets kann jeweils ein solches Fenster aktiviert werden. Oft ist dieser Ansatz jedoch nicht sinnvoll, da die Ansicht anderer Fenster ausgeblendet ist.
Eine Möglichkeit, mehrere Fenster gleichzeitig anzuzeigen, besteht darin, sie als unabhängige Fenster zu erstellen. Dies wird als SDI bezeichnet (Single Document Interface). Dies erfordert mehr Speicherressourcen, da jedes Fenster möglicherweise über ein eigenes Menüsystem, eine eigene Symbolleiste usw. verfügt.
Das MDI-Framework in wxPython bietet eine wx.MDIParentFrame-Klasse. Das Objekt fungiert als Container für mehrere untergeordnete Fenster, die jeweils ein Objekt der Klasse wx.MDIChildFrame sind.
Untergeordnete Fenster befinden sich im MDIClientWindow-Bereich des übergeordneten Frames. Sobald ein untergeordneter Frame hinzugefügt wird, wird in der Menüleiste des übergeordneten Frames ein Fenstermenü mit Schaltflächen angezeigt, mit denen die untergeordneten Frames kaskadiert oder gekachelt angeordnet werden können.
Beispiel
Das folgende Beispiel zeigt die Verwendung von MDIParentFrame als Fenster der obersten Ebene. Eine Menüschaltfläche namens NewWindow fügt ein untergeordnetes Fenster im Clientbereich hinzu. Es können mehrere Fenster hinzugefügt und dann in einer kaskadierten oder gekachelten Reihenfolge angeordnet werden.
Der vollständige Code lautet wie folgt:
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()
Der obige Code erzeugt die folgende Ausgabe -