前項までにいくつかのSizerを紹介してきましたが、それらを組み合わせて使用する事によって、より複雑な配置をする事が可能となります。サンプルとして電卓のレイアウトを見てみましょう。
電卓のレイアウトサンプル
レイアウトのみでイベント設定はしていません。さらにまだ紹介していないMenuBarやTextCtrlなども使用していますが、これは別項にて説明します。
import wx class CalcFrame(wx.Frame): """ フレームを継承したトップレベルウィンドウクラス """ def __init__(self): super().__init__(None, wx.ID_ANY, '電卓レイアウト', size=(300, 280)) # ステータスバーの初期化 self.CreateStatusBar() self.SetStatusText('https://www.python-izm.com/') self.GetStatusBar().SetBackgroundColour(None) # メニューバーの初期化 self.SetMenuBar(CalcMenu()) # 本体部分の構築 root_panel = wx.Panel(self, wx.ID_ANY) text_panel = TextPanel(root_panel) cmdbutton_panel = CommandButtonPanel(root_panel) calcbutton_panel = CalcButtonPanel(root_panel) root_layout = wx.BoxSizer(wx.VERTICAL) root_layout.Add(text_panel, 0, wx.GROW | wx.ALL, border=10) root_layout.Add(cmdbutton_panel, 0, wx.GROW | wx.LEFT | wx.RIGHT, border=20) root_layout.Add(calcbutton_panel, 0, wx.GROW | wx.ALL, border=10) root_panel.SetSizer(root_layout) root_layout.Fit(root_panel) class CalcMenu(wx.MenuBar): """ CalcFrameにセットするメニューバークラス """ def __init__(self): super().__init__() menu_file = wx.Menu() menu_file.Append(wx.ID_ANY, '保存') menu_file.Append(wx.ID_ANY, '終了') menu_edit = wx.Menu() menu_edit.Append(wx.ID_ANY, 'コピー') menu_edit.Append(wx.ID_ANY, 'ペースト') self.Append(menu_file, 'ファイル') self.Append(menu_edit, '編集') class TextPanel(wx.Panel): """ 画面上部に表示されるテキスト部分 """ def __init__(self, parent): super().__init__(parent, wx.ID_ANY) calc_text = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_RIGHT) layout = wx.BoxSizer(wx.HORIZONTAL) layout.Add(calc_text, 1) self.SetSizer(layout) class CommandButtonPanel(wx.Panel): """ 画面中部に表示されるボタン部分 """ def __init__(self, parent): super().__init__(parent, wx.ID_ANY) button_ce = wx.Button(self, wx.ID_ANY, 'CE') button_c = wx.Button(self, wx.ID_ANY, 'C') layout = wx.BoxSizer(wx.HORIZONTAL) layout.Add(button_ce, flag=wx.GROW) layout.Add(button_c, flag=wx.GROW) self.SetSizer(layout) class CalcButtonPanel(wx.Panel): """ 画面下部に表示されるボタン部分 """ def __init__(self, parent): super().__init__(parent, wx.ID_ANY) button_collection = ('7', '8', '9', '+', '4', '5', '6', '-', '1', '2', '3', '*', '0', '.', '=', '/') layout = wx.GridSizer(4, 4, 3, 3) for i in button_collection: layout.Add(wx.Button(self, wx.ID_ANY, i, size=(30,25)), 1, wx.GROW) self.SetSizer(layout) if __name__ == '__main__': # カスタムフレームを初期化してアプリケーションを開始 application = wx.App() frame = CalcFrame() frame.Show() application.MainLoop()
イベント設定していないので、ボタンを押しても動作はしません。
レイアウト階層
上記サンプルのレイアウト構造は、階層で表示するとこのようになります。人によっては違った印象を持つかもしれませんし、異なる方法で全く同じ配置をする事も可能なので、あくまで一例として考えてください。
- Frame - CalcFrame
- MenuBar - CalcMenu
- Panel - root_panel
- Panel -- TextPanel
- Panel -- CommandButtonPanel
- Panel -- CalcButtonPanel
- StatusBar