デバッグ作業中
スクロールするパネルの上にタブを置く。
このとき、作ったプログラムがおかしな挙動を示すので、簡単な例から原因を追及する。
取り急ぎ作成のプロトタイプは、全く異常なし。予想通りの動作を示す。
import wx import wx.lib.scrolledpanel as sp class Notebooks(wx.Notebook): def __init__(self, parent): wx.Notebook.__init__(self, parent, wx.ID_ANY, style=wx.NB_TOP) tab1 = wx.Panel(self, wx.ID_ANY) tab2 = wx.Panel(self, wx.ID_ANY) btn1 = wx.Button(tab1, wx.ID_ANY, "Button1", size=(200,-1)) btn2 = wx.Button(tab2, wx.ID_ANY, "Button2", size=(200,-1)) self.AddPage(tab1, 'Tab1') self.AddPage(tab2, 'Tab2') class MyApp(wx.App): def OnInit(self): self.frame = MyFrame(None, title="Test frame") self.SetTopWindow(self.frame) self.frame.Show() return True class MyFrame(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, wx.ID_ANY, title, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE) self.panel = sp.ScrolledPanel(self) vsizer = wx.BoxSizer(wx.VERTICAL) gd01 = wx.TextCtrl(self.panel, wx.ID_ANY, " ") gd02 = wx.TextCtrl(self.panel, wx.ID_ANY, " ") gd03 = wx.TextCtrl(self.panel, wx.ID_ANY, " ") gd04 = wx.TextCtrl(self.panel, wx.ID_ANY, " ") gd05 = wx.TextCtrl(self.panel, wx.ID_ANY, " ") gd10 = Notebooks(self.panel) vsizer.Add(gd01, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(gd02, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(gd03, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(gd04, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(gd05, 0, wx.ALIGN_LEFT|wx.ALL, 5) vsizer.Add(gd10, 0, wx.ALIGN_LEFT|wx.ALL, 5) self.panel.SetSizer(vsizer) vsizer.Fit(self.panel) self.panel.SetupScrolling() if __name__ == "__main__": app = MyApp(False) app.MainLoop()
[追記]
画面の縦の長さが十分大きければ問題ないようだ。十分大きいとは、タブの画面が全部表示されるぐらい。画面が小さく、タブの画面の一部が隠れていると、自動的に最適な表示になるよう、画面のスクロールが起こる。なので、画面の縦の長さをよく考えて指定するようにすれば解決できる。