Button
wxPythonにおける最も基本的な部品の一つであるButtonの紹介です。様々なイベントの起点となる部品でもあるので、是非覚えておきましょう。
パネルへボタンを追加しています。初期化時の引数には(親ウィンドウ、識別子、ラベル)の順番で渡しています。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン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()
--実行結果--

先程のサンプルでは初期化時にラベル(ボタンに表示される文字)を指定していました。もちろんラベルを変更するメソッドも用意されています。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_3.SetLabel(u"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の設定に依存する場合もあるので注意しましょう。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3", size=(50,50))
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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」を使用します。16行目にて使用するFontクラスを初期化しています。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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」を使用します。サンプルでは赤へ変更しています。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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」を使用します。サンプルでは青へ変更しています。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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」を使用しましょう。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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」を使用します。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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」を用います。 なおボタンは「見えない」だけで本体は存在しています。 非表示状態のボタンに対してラベル設定をしたりする事も可能です。
# -*- coding: utf-8 -*-
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, wx.ID_ANY, u"ボタン3")
button_4 = wx.Button(panel, wx.ID_ANY, u"ボタン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してもイベントはきちんと動作します。
# -*- 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")
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
frame.CreateStatusBar()
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")
button_1 = wx.Button(panel, wx.ID_ANY, u"ボタン1")
button_2 = wx.Button(panel, wx.ID_ANY, u"ボタン2")
button_3 = wx.Button(panel, 3333, u"ボタン3")
button_4 = wx.Button(panel, 4444, u"ボタン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アプリケーションには欠かせません!
