前項でのCheckBoxに続き、こちらも高頻度での使用が予想されるRadioButtonの紹介です。複数の選択肢から1つ以上を選択出来るチェックボックスに対して、ラジオボタンは複数の選択肢から1つだけ選択するようなケースで利用されます。なお同様の機能を有するRadioBoxについては次項で解説します。
基本的な使い方
パネルへラジオボタンを追加しています。引数には(親ウィンドウ、識別子、ラベル)の順番で渡しています。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1')
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン3')
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン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()

ラベル設定
先程のサンプルでは初期化時にラベル(ラジオボタンに表示される文字)を指定していました。ラベルを変更するメソッドも用意されているので、必要に応じて使いましょう。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1')
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン3')
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン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を使用しましょう。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1')
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン3')
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン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が押せない状態となっています。

ツールチップ設定
ラジオボタンへツールチップ(補足情報を載せる小さいウィンドウ)を表示させるにはSetToolTipを使用します。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1')
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン3')
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン4')
radiobutton_3.SetToolTip('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してもイベントはきちんと動作します。
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, 'テストフレーム', size=(300, 200))
frame.CreateStatusBar()
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1')
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, 3333, 'ラジオボタン3')
radiobutton_4 = wx.RadioButton(panel, 4444, 'ラジオボタン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がチェックの付いていない状態となります。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1')
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン3')
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン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指定があるまでは同一のグループとして識別されます。
import wx
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))
panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour('#AFAFAF')
radiobutton_1 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン1', style=wx.RB_GROUP)
radiobutton_2 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン2')
radiobutton_3 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン3', style=wx.RB_GROUP)
radiobutton_4 = wx.RadioButton(panel, wx.ID_ANY, 'ラジオボタン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つのグループとなります。両グループは別のグループですので、当然それぞれから1つずつ選択する事が出来ます。

