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论坛(中国語)