wxPythonでGUIアプリを作る GUIコンポーネントとサイザー
GUIを作るために必要な要素(Frame,button,text,textcontrolなど)はwxWindowクラスの派生クラスとして提供されています。GUIを設計するためにこれらの要素を一つずつフォームに配置していきます。
例えばwxFrameがwxMuneBarやwxPaneを含んでいて、さらにwxPaneがwxStaticTextなどを含んでいる場合にはこんな階層構造をとることになります。
wxFrame | |||
-> | wxMuneBar | ||
-> | wxPanel | ||
-> | wxStaticText | wxTextCtrl | |
-> | wxStaticText | wxTextCtrl | |
wxPanel | |||
-> | wxStaticText | wxTextCtrl | |
-> | wxStaticText | wxTextCtrl |
要素をそのまま配置すると位置やサイズが常に固定になってしまいますが、Sizerクラスを利用すると自動的にレイアウトを整えることができます。Frameの大きさが変化しても、Sizerが各要素のサイズと位置を自動的に計算して再配置してくれます。
実際に使うにはwx.Sizerから派生したサブクラスwx.BoxSizer,wx.GridSizerなどを利用します。wx.BoxSizerは水平・垂直方向に要素を整形し、wx.GridSizerは要素を自動で格子状に配置してくれます。Sizerの中にSizerを追加して入れ子にすることもできます。
次のサンプルはwx.BoxSizerを使ったコントロール配置例です。wx.BoxSizerを宣言するときに引数としてレイアウトの方向を指定します。
import wx class MainWindow(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, parent, title=title, size=(400,400)) #子サイザーを用意する(水平方向に整形) self.childSizer = wx.BoxSizer(wx.HORIZONTAL) #ボタンを作成する self.startButton =wx.Button(self, -1, "Start") self.stopButton =wx.Button(self, -1, "Stop") #子サイザーにボタンを追加する self.childSizer.Add(self.startButton, 0, wx.EXPAND) self.childSizer.Add(self.stopButton, 0, wx.EXPAND) #メインサイザーを用意する(垂直方向に整形) self.sizer = wx.BoxSizer(wx.VERTICAL) #テキストボックスとラベルを作成する self.textControl = wx.TextCtrl(self, size=(300,100), style=wx.TE_MULTILINE) self.label = wx.StaticText(self, label="Label :") #サイザーに追加する self.sizer.Add(self.textControl, 0, wx.EXPAND) self.sizer.Add(self.childSizer, 0, wx.ALIGN_CENTER) self.sizer.Add(self.label, 0, wx.EXPAND) #Frameにサイザーを追加する self.SetSizer(self.sizer) #サイザーのレイアウトを行う self.SetAutoLayout(1) self.sizer.Fit(self) self.Show() app = wx.App(False) frame = MainWindow(None, "sample") app.MainLoop()
要素を登録するにはAddメソッドを使います。引数として、Sizerに追加する要素、proportion 、レイアウトを行うためのflagを指定します。
proportion が0の場合は要素のサイズを変えず、1の場合はフレームのサイズと連動して要素のサイズも変更してくれるみたいです。
flagの値を変えると、レイアウトをどのような規則で行ってくれるのかを指定することができます。(例えばwx.ALIGN_CENTERなら中央に配置するなど)
作成したサイザーを、SetSizerメソッドでFrameに追加します。その後SetAutoLayoutやFitによって自動レイアウトを行っています。