パネルを折りたたむ方法(wx.lib.foldpanelbar)

いままでは、フレームの上に複数のパネルを上から順番に並べるような配置でGUIを作っていた。
サイザーを使うなどして、これでも十分納得できるものが作れるのであるが、なんか見栄えが今ひとつであった。
そこで、wxPythonデモをあれこれ探してみると、"FoldPanelBar.py"という、まさしく自分が求めているようなことを実現しているサンプルプログラムが見つかった。wx.lib.foldpanelbarというモジュールを使っている。

これを使うと、

  • 項目群を明確に分離できる。
  • 各項目群をそれぞれ折りたたむことができる。

以前もこれと同じことをしようとして、そのときもいろいろ探したのであるが、wx.CollapsiblePane しか見つからず、それを使ってもどうもダメそうだと諦めていた。
今日はラッキーデー。

wx.lib.foldpanelbarの実装例を以下に示す。
これとsizerを組み合わせれば、かなり良い見栄えになりそうだ。sizerが問題なく使えるかを今後は検討する。

import wx
import wx.lib.foldpanelbar as fpb

class NotCollapsed(wx.Frame):
    def __init__(self, parent, id=wx.ID_ANY, title='', pos=wx.DefaultPosition,
                 size=(400,300), style=wx.DEFAULT_FRAME_STYLE):

        wx.Frame.__init__(self, parent, id, title, pos, size, style)

        pnl = fpb.FoldPanelBar(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
                           fpb.FPB_DEFAULT_STYLE | fpb.FPB_VERTICAL)

        # (1)
        item = pnl.AddFoldPanel("(1) Sun", collapsed=False)
        button1 = wx.Button(item, wx.ID_ANY, "Japan")

        pnl.AddFoldPanelWindow(item, button1, fpb.FPB_ALIGN_LEFT)

        # (2)
        item = pnl.AddFoldPanel("(2) Moon", collapsed=False)
        pnl.AddFoldPanelSeparator(item)
        self.StTxt = wx.StaticText(item, -1, "Your value")
        pnl.AddFoldPanelWindow(item, self.StTxt,
                               fpb.FPB_ALIGN_WIDTH, fpb.FPB_DEFAULT_SPACING,
                               20, 20)
        pnl.AddFoldPanelWindow(item, wx.TextCtrl(item, -1, ""),
                               fpb.FPB_ALIGN_LEFT, fpb.FPB_DEFAULT_SPACING,
                               20)
        # (3)
        item = pnl.AddFoldPanel("(3) Mars", collapsed=False)        
        
class MyApp(wx.App):
    def OnInit(self):
        frame = NotCollapsed(None, title="Test")
        frame.Show()

        return True

app = MyApp()
app.MainLoop()