wxCollapsiblePaneで開閉できるパネルを作る
ボタンを押すと出たり消えたりするパネルを、wxPythonで作りたい。wxCollapsiblePaneが、一番動作イメージに近いかな、と思うので使い方を検討する。
参考:wxPython API Documentation — wxPython Phoenix 4.0.3 documentation
例えば、「Show」の方のラジオボタンを押すと現れて、「Hide」の方を押すと隠れるようにしてみる。wx.CollapsiblePaneを使って以下のコードを書く。
気に入らない点は、三角のトグルスイッチが常に表示される、というところ。ラジオボタンでパネルの開閉をコントロールしたいので、理想的にはトグルスイッチは不要だ。
import wx label1 = "Test label" class MyApp(wx.PySimpleApp): def OnInit(self): Frm = wx.Frame(None, -1, 'Title', size=(300, 250)) self.p = p = wx.Panel(Frm, -1) #大元になるパネル self.rbox = wx.RadioBox(p, -1, "Test", choices=['Show', 'Hide']) #このボタンでパネルを出したり隠したりする self.rbox.SetSelection(1) #最初はHideにしておく。 self.rbox.Bind(wx.EVT_RADIOBOX, self.check) self.cp = wx.CollapsiblePane(p, label=label1, style=wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE) self.cp.Disable() self.cp.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.changed) cp = self.cp.GetPane() #パネルの上に何か置くときGetPane()でアクセスできる st1 = wx.StaticText(cp, -1, "This is a sentence..." ) st2 = wx.StaticText(cp, -1, "Can you see?" ) ssizer = wx.BoxSizer(wx.VERTICAL) ssizer.Add(st1, 0, wx.ALL, 10) ssizer.Add(st2, 0, wx.ALL, 10) cp.SetSizer(ssizer) st3 = wx.StaticText(p, -1, "hoge hoge ..." ) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.rbox, 0, wx.ALL|wx.CENTER, 10) sizer.Add(self.cp, 0, wx.ALL|wx.CENTER, 10) sizer.Add(st3, 0, wx.ALL|wx.CENTER, 10) p.SetSizer(sizer) Frm.Show() return 1 def changed(self, evt=None): self.p.Layout() def check(self, evt): num = self.rbox.GetSelection() if num == 0: self.cp.Collapse(False) #パネルを開く self.cp.Enable() else: self.cp.Collapse(True) #パネルを隠す self.cp.Disable() self.changed() app = MyApp() app.MainLoop()
トグルスイッチを押されて、パネルが開かれるのを防ぐために、初期にはColloapsiblePaneはDisableにしてある。ラジオボタンを「Show」にしたとき、初めてEnableになりパネルが開く。
「Show」のときも、トグルスイッチでパネルを閉じることができるが、それはまあ、良しとする。
Windowsで実行すると、下のように見た目が若干異なる。トグルスイッチがボタンになる。