RadioButton
前項でのCheckBoxに続き、こちらも高頻度での使用が予想されるRadioButtonの紹介です。 複数の選択肢から1つ以上を選択出来るチェックボックスに対して、ラジオボタンは「複数の選択肢から1つだけ選択する」ようなケースで利用されます。 なお同様の機能を有する「RadioBox」については次項で解説します。
パネルへラジオボタンを追加しています。引数には(親ウィンドウ、識別子、ラベル)の順番で渡しています。
# -*- 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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1")
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン3")
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン4")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=wx.GROW)
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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1")
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン3")
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン4")
radiobutton_3.SetLabel("RadioButton3")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
radiobutton_3のラベルが「ラジオボタン3」ではなく「RadioButton3」となりました。

ラジオボタンを無効(選択出来ない状態)にするには「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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1")
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン3")
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン4")
radiobutton_3.Disable()
#radiobutton_3.Enable()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1")
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン3")
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン4")
radiobutton_3.SetToolTipString("python-izm.com")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
「ラジオボタン3」の上にマウスカーソルを載せると、メッセージが出るようになります。

ラジオボタンへイベントを設定するには「Bind」を使用します。 引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し「ラジオボタン1」と「ラジオボタン2」ではそれぞれ違う関数を定義してイベント設定しています。 「ラジオボタン3」と「ラジオボタン4」では、引数に「イベント発生元」を追加し、チェックボックス初期化時のIDで判別して挙動を変えています。 なおサンプルでもあるように、ラジオボタン・フレームのどちらにBindしてもイベントはきちんと動作します。
# -*- coding: utf-8 -*-
import wx
def selected_radiobutton_1(event):
frame.SetStatusText("Selected! radiobutton_1")
def selected_radiobutton_2(event):
frame.SetStatusText("Selected! radiobutton_2")
def selected_radiobutton(event):
if event.GetId() == 3333:
frame.SetStatusText("Selected! radiobutton_3")
elif event.GetId() == 4444:
frame.SetStatusText("Selected! radiobutton_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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1")
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, 3333, u"ラジオボタン3")
radiobutton_4 = wx.RadioButton(panel, 4444, u"ラジオボタン4")
radiobutton_1.Bind(wx.EVT_RADIOBUTTON, selected_radiobutton_1)
radiobutton_2.Bind(wx.EVT_RADIOBUTTON, selected_radiobutton_2)
frame.Bind(wx.EVT_RADIOBUTTON, selected_radiobutton, radiobutton_3)
frame.Bind(wx.EVT_RADIOBUTTON, selected_radiobutton, radiobutton_4)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
ラジオボタンを選択すると、ステータスバーにそれぞれ違ったメッセージが入ります。

ラジオボタンの選択状態の設定は「SetValue」、取得が「GetValue」です。 設定・取得どちらのケースでも「True」がチェックが付いている状態で、「False」がチェックの付いていない状態となります。
# -*- 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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1")
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン3")
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン4")
radiobutton_1.SetValue(True)
radiobutton_2.SetValue(True)
radiobutton_3.SetValue(True)
radiobutton_4.SetValue(True)
print radiobutton_1.GetValue()
print radiobutton_2.GetValue()
print radiobutton_3.GetValue()
print radiobutton_4.GetValue()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
上記サンプルは全てのラジオボタンが「True」に設定されていますが、グループ化されているラジオボタン内では常に1つしか選択状態とならないため、最後に「True」としたラジオボタン4が選択されている状態となります。

今までのサンプルコードでは、全てのラジオボタンが1つのグループと見なされ、4つのラジオボタンの中から1つしか選択する事が出来ませんでした。別個の選択肢を作成する場合は「style」に「RB_GROUP」を指定します。これを指定すると、次の「RB_GROUP」指定があるまでは同一のグループとして識別されます。
# -*- 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")
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン1", style=wx.RB_GROUP)
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン2")
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン3", style=wx.RB_GROUP)
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, u"ラジオボタン4")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radiobutton_1, flag=wx.GROW)
layout.Add(radiobutton_2, flag=wx.GROW)
layout.Add(radiobutton_3, flag=wx.GROW)
layout.Add(radiobutton_4, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
「ラジオボタン1」と「ラジオボタン2」が1つのグループで、「ラジオボタン3」と「ラジオボタン4」が別のグループとなります。両グループは別個のグループですので、当然それぞれのグループから1つずつ選択する事が出来ます。

RadioButtonよりも使いやすい!?
