Button
wxPythonにおける最も基本的な部品の一つであるButtonの紹介です。
様々なイベントの起点となる部品でもあるので、是非覚えておきましょう。
パネルへボタンを追加しています。
コンストラクタには(親ウィンドウ、識別子、ラベル)の順番で渡しています。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") layout = wx.BoxSizer(wx.VERTICAL) layout.Add(button_1) layout.Add(button_2) layout.Add(button_3) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
先程のサンプルではコンストラクタにてラベル(ボタンに表示される文字)を指定していました。
もちろんラベルを変更する関数も用意されています。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_3.SetLabel("Button3") layout = wx.BoxSizer(wx.VERTICAL) layout.Add(button_1) layout.Add(button_2) layout.Add(button_3) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
button_3のラベルが「ボタン3」ではなく「Button3」となりました。
ボタンのサイズを変更するにはコンストラクタへ「size」を渡します。それ以外にも「SetSize」「SetMaxSize」「SetMinSize」関数でも設定可能ですが、Sizerの設定に依存する場合もあるので注意しましょう。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3",size=(50,50)) button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") # button_3.SetSize((50,50)) # button_3.SetMaxSize((50,50)) # button_3.SetMinSize((50,50)) layout = wx.GridSizer(2,2) layout.Add(button_1) layout.Add(button_2) layout.Add(button_3) layout.Add(button_4) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
サイズ変更をした「ボタン3」のみ大きさが違います。
ボタンのフォント(文字の大きさや太字設定)を変更するには「SetFont」関数を使用します。19行目にて使用するFontクラスを初期化しています。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") font = wx.Font(20,wx.FONTFAMILY_DEFAULT,wx.FONTSTYLE_NORMAL,wx.FONTWEIGHT_NORMAL) button_3.SetFont(font) layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
「ボタン3」の文字の大きさを変更しました。
ボタンの文字色の変更には「SetForegroundColour」関数を使用します。サンプルでは赤へ変更しています。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") button_3.SetForegroundColour("#FF0000") layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
「ボタン3」文字色を赤へ変更しました。
ボタンの背景色の変更は「SetBackgroundColour」関数を使用します。サンプルでは青へ変更しています。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") button_3.SetBackgroundColour("#0000FF") layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
「ボタン3」背景色を青へ変更しました。
ボタンを無効(押せない状態)にするには「Disable」関数を使用します。それとは逆に無効状態となっているボタンを有効(押せる状態)へ変更するには「Enable」関数を使用しましょう。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") button_3.Disable() # button_3.Enable() layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
「ボタン3」が押せない状態となっています。
ボタンへツールチップ(補足情報を載せる小さいウィンドウ)を表示させるには「SetToolTipString」関数を使用します。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") button_3.SetToolTipString("python-izm.com") layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
「ボタン3」の上にマウスカーソルを載せると、メッセージが出るようになります。
ボタンを非表示にするには「Hide」関数を使用しましょう。非表示状態のボタンを表示させるには「Show」関数を用います。尚、ボタンは「見えない」だけで本体は存在しています。非表示状態のボタンに対してラベル設定をしたりする事も可能です。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,wx.ID_ANY,"ボタン3") button_4 = wx.Button(panel,wx.ID_ANY,"ボタン4") button_3.Hide() # button_3.Show() layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
「ボタン3」が隠れています。見えないだけなのでプログラム上で操作してもエラーとはなりません。
ボタンへイベントを設定するには「Bind」関数を使用します。
引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、「ボタン1」と「ボタン2」ではそれぞれ違う関数を定義してイベント設定しています。
「ボタン3」と「ボタン4」では、引数に「イベント発生元」を追加し、ボタン初期化時のIDで判別して挙動を変えています。尚、サンプルでもあるように、ボタン・フレームのどちらにBindしてもイベントはきちんと動作します。
#! c:/Python26/python.exe # -*- coding: utf-8 -*- import wx def click_button_1(event): frame.SetStatusText("Click! button_1") def click_button_2(event): frame.SetStatusText("Click! button_2") def click_button(event): if event.GetId() == 3333: frame.SetStatusText("Click! button_3") elif event.GetId() == 4444: frame.SetStatusText("Click! button_4") if __name__ == "__main__": application = wx.App() frame = wx.Frame(None,wx.ID_ANY,"テストフレーム",size=(300,200)) frame.CreateStatusBar() panel = wx.Panel(frame,wx.ID_ANY) panel.SetBackgroundColour("#AFAFAF") button_1 = wx.Button(panel,wx.ID_ANY,"ボタン1") button_2 = wx.Button(panel,wx.ID_ANY,"ボタン2") button_3 = wx.Button(panel,3333,"ボタン3") button_4 = wx.Button(panel,4444,"ボタン4") button_1.Bind(wx.EVT_BUTTON,click_button_1) button_2.Bind(wx.EVT_BUTTON,click_button_2) frame.Bind(wx.EVT_BUTTON,click_button,button_3) frame.Bind(wx.EVT_BUTTON,click_button,button_4) layout = wx.GridSizer(2,2) layout.Add(button_1,0,wx.GROW) layout.Add(button_2,0,wx.GROW) layout.Add(button_3,0,wx.GROW) layout.Add(button_4,0,wx.GROW) panel.SetSizer(layout) frame.Show() application.MainLoop()
--実行結果--
ボタンを押すと、ステータスバーにそれぞれ違ったメッセージが入ります。
こちらもGUIアプリケーションには欠かせません!