wxPython-マルチドキュメントインターフェイス

一般的なGUIアプリケーションには、複数のウィンドウがあります。タブ付きおよびスタックウィジェットを使用すると、一度に1つのそのようなウィンドウをアクティブ化できます。ただし、他のウィンドウのビューが非表示になっているため、このアプローチは役に立たない場合があります。

複数のウィンドウを同時に表示する1つの方法は、それらを独立したウィンドウとして作成することです。これはSDIと呼ばれます(Single Document Interface)。各ウィンドウに独自のメニューシステム、ツールバーなどがある場合があるため、これにはより多くのメモリリソースが必要です。

wxPythonのMDIフレームワークは、wx.MDIParentFrameクラスを提供します。そのオブジェクトは、それぞれがwx.MDIChildFrameクラスのオブジェクトである複数の子ウィンドウのコンテナとして機能します。

子ウィンドウは、親フレームのMDIClientWindow領域にあります。子フレームが追加されるとすぐに、親フレームのメニューバーに、子をカスケードまたはタイル状に配置するためのボタンを含むウィンドウメニューが表示されます。

次の例は、トップレベルウィンドウとしてのMDIParentFrameの使用法を示しています。NewWindowというメ​​ニューボタンは、クライアント領域に子ウィンドウを追加します。複数のウィンドウを追加して、カスケードまたはタイル状の順序で配置できます。

完全なコードは次のとおりです-

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

上記のコードは次の出力を生成します-