ウィンドウをスクロールしたい(wxPanelでのスクロールは諦めるべき?)

wxPanelでパネルを作り、そこにコントロールをどんどん置いていくと画面に納まらなくなってしまった。そこで縦方向にスクロールさせるべく、wxPanelのスタイルを調べるとwxVSCROLLというものがあるらしい。それを指定して下のようにやってみた。

""" 動かないコード
"""
import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Test", size=(200,150))
        Pan = wx.Panel(self, -1, style=wx.VSCROLL)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        StTxt1 = wx.StaticText(Pan, -1, "AAAAAA")
        StTxt2 = wx.StaticText(Pan, -1, "BBBBBB")
        StTxt3 = wx.StaticText(Pan, -1, "CCCCCC")
        StTxt4 = wx.StaticText(Pan, -1, "DDDDDD")
        StTxt5 = wx.StaticText(Pan, -1, "EEEEEE")
        StTxt6 = wx.StaticText(Pan, -1, "FFFFFF")
        StTxt7 = wx.StaticText(Pan, -1, "GGGGGG")
        
        sizer.Add(StTxt1, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt2, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt3, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt4, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt5, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt6, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt7, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        Pan.SetSizer(sizer)
        self.Show()

class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame()
        return True

app = MyApp()
app.MainLoop()

こうすると、フレーム内にスクロールバーが確かに表示されるのだが、マウスでカチカチやっても反応がなく、バーが動かない。バーを動かすメソッドを探してみると、SetScrollbarとかがそれに対応するのかと試みたがどうもうまく機能しない。

代替案として、wxScrolledWindowを使う。これは確実に動作する。

""" 動くコード
"""
import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Test", size=(200,150))
        Pan = wx.ScrolledWindow(self, -1)
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        StTxt1 = wx.StaticText(Pan, -1, "AAAAAA")
        StTxt2 = wx.StaticText(Pan, -1, "BBBBBB")
        StTxt3 = wx.StaticText(Pan, -1, "CCCCCC")
        StTxt4 = wx.StaticText(Pan, -1, "DDDDDD")
        StTxt5 = wx.StaticText(Pan, -1, "EEEEEE")
        StTxt6 = wx.StaticText(Pan, -1, "FFFFFF")
        StTxt7 = wx.StaticText(Pan, -1, "GGGGGG")
        
        sizer.Add(StTxt1, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt2, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt3, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt4, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt5, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt6, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        sizer.Add(StTxt7, 0, wx.ALIGN_LEFT|wx.ALL, 5)
        Pan.SetSizer(sizer)
        Pan.SetScrollRate(10,10)
        self.Show()

class MyApp(wx.App):
    def OnInit(self):
        self.frame = MyFrame()
        return True

app = MyApp()
app.MainLoop()

wxPanelにこだわる理由もないので、素直にwxScrolledWindowを使えばいいのだろうな。