NotebookをPanelの上に置くときはSizerで調整

wx.Notebookで、タブ切換えの複数の画面を作りたいときには、Frameの上にNotebookを置いて、以下のようにやればよい。

import wx

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        Frm = wx.Frame(None, -1, 'Title', size=(500, 500))

        nb = wx.Notebook(Frm, -1, style=wx.CLIP_CHILDREN)

        pnl1 = wx.Panel(nb, -1)
        pnl2 = wx.Panel(nb, -1)
        nb.AddPage(pnl1, 'Page 1')
        nb.AddPage(pnl2, 'Page 2')

        StTxt = wx.StaticText(pnl1, -1, 'Text', pos=(20,30))

        Frm.Show()
        return 1

app = MyApp()
app.MainLoop()

実行画面は以下の通り。

次に、NotebookをFrame上に置くのではなく、Frame上のPanel上に置きたい。このとき、下記のようなコードを書くとする。

import wx

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        Frm = wx.Frame(None, -1, 'Title', size=(500, 500))
        pnl0 = wx.Panel(Frm, -1, size=(500, 500))
        nb = wx.Notebook(pnl0, -1, style=wx.CLIP_CHILDREN)

        pnl1 = wx.Panel(nb, -1)
        pnl2 = wx.Panel(nb, -1)
        nb.AddPage(pnl1, 'Page 1')
        nb.AddPage(pnl2, 'Page 2')

        StTxt = wx.StaticText(pnl1, -1, 'Text', pos=(20,30))
        Frm.Show()
        return 1

app = MyApp()
app.MainLoop()

上のコードを実行すると、下の画面が表示される。

つまり、表示が正しくない。実行時にエラーが出るわけではないので、文法的な誤りではない。こちらの意図した通りに表示されていないだけなので、こう表示して欲しいという「こちらの意図」をちゃんと伝える必要がある。そうするためには、Sizerを使って「並べ方」を伝えればよい。
修正したコードは以下の通り。

import wx

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        Frm = wx.Frame(None, -1, 'Title', size=(500, 500))
        pnl0 = wx.Panel(Frm, -1, size=(500, 500))
        nb = wx.Notebook(pnl0, -1, style=wx.CLIP_CHILDREN)

        pnl1 = wx.Panel(nb, -1)
        pnl2 = wx.Panel(nb, -1)
        nb.AddPage(pnl1, 'Page 1')
        nb.AddPage(pnl2, 'Page 2')

        StTxt = wx.StaticText(pnl1, -1, 'Text', pos=(20,30))

        sizer = wx.BoxSizer(wx.VERTICAL) #追加
        sizer.Add(nb, 1, wx.EXPAND)  #追加
        pnl0.SetSizer(sizer) #追加

        Frm.Show()
        return 1

app = MyApp()
app.MainLoop()

こうすると、表示画面は以下のようになり、正しく表示されている。

参考サイト:wx.Notebook的标签美化(添加图例或者设置大小)。。-CSDN论坛(中国語)