MDI(Multiple Document Interface)の実装練習

Excelではメインのウィンドウが一つあり、複数のファイルを開くとそのウィンドウ内に開いたファイルの数だけ画面が作成される。このインターフェースをMDI(Multiple Document Interface)と言うらしい。
ExcelのMDI↓

Firefox等のウェブブラウザでは、開いた画面はタブ化されて画面遷移がタブで制御できる。この画面のタブ化もMDIの一種(というか発展形か)。
wxPythonでMDIを実装できるので、その練習。
wxMDIParentFrame、wxMDIChildFrameクラスを用いる。以下、テストコード。

import wx

class MyParentFrame(wx.MDIParentFrame):
    def __init__(self):
        wx.MDIParentFrame.__init__(
            self, None, -1, "test", size=(500,400),
            style = wx.DEFAULT_FRAME_STYLE | wx.HSCROLL | wx.VSCROLL)
        self.Bind(wx.EVT_SIZE, self.OnSize)

        self.win = wx.SashLayoutWindow(self, -1,
                                       style=wx.NO_BORDER|wx.SW_3D)
        self.win.SetDefaultSize((500, 30))
        self.win.SetOrientation(wx.LAYOUT_HORIZONTAL)
        self.win.SetAlignment(wx.LAYOUT_TOP)
        self.Pan = wx.Panel(self.win, -1)

        self.RBtn2 = wx.Button(self.Pan, -1, "Open panels")
        self.RBtn2.Bind(wx.EVT_BUTTON, self.windowOpen)

    def OnSize(self, event):
        wx.LayoutAlgorithm().LayoutMDIFrame(self)

    def windowOpen(self, evt):
        win1 = wx.MDIChildFrame(self, -1, "Panel1")
        win2 = wx.MDIChildFrame(self, -1, "Panel2")
        win3 = wx.MDIChildFrame(self, -1, "Panel3")
        
class MyApp(wx.App):
    def OnInit(self): 
        self.frame = MyParentFrame()
        self.frame.Show(True)
        self.SetTopWindow(self.frame)
        return True

app = MyApp(False)
app.MainLoop()

起動画面。

ボタンを押すと、ウィンドウが3つ開く。