RadioBox
前項で解説したRadioButtonの拡張版ともいえるRadioBoxの紹介です。ラジオボタンとの違いは下記の通りです。
- StaticBoxSizerのようなタイトル付きボーダーで要素が囲われる
- グループ内の値の設定・取得が容易
- ボタン要素が動的なケースでの使用に向いている
基本的な使用方法として、BoxSizerのような横配置があります。初期化時の引数には(親ウィンドウ、識別子、ラベル、ボタン要素配列、配置方向指定)の順番で渡しています。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_HORIZONTAL)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
タイトル付きボーダーに囲われたラジオボタンが表示されます。

次は縦配置です。styleに「RA_VERTICAL」を指定します。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_VERTICAL)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--

一定の要素数にて、折り返しをして配置させる事も可能です。ボタン要素の数が多い時などのケースで有効な手段となるでしょう。設定方法は初期化時に「majorDimension」を指定します。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4", "RB5", "RB6", "RB7", "RB8", "RB9", "RB10")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, majorDimension=4, style=wx.RA_HORIZONTAL)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
「majorDimension」を「4」で設定しているので、1つの行に4つ以上は配置されません。

ボタンのラベル変更を行うには「SetItemLabel」、もしくは「SetString」を使用します。 どちらも引数に(ボタン要素のインデックス、変更後ラベル)を設定することで利用することができます。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_VERTICAL)
radio_box.SetItemLabel(1, u"ラジオボックス2")
radio_box.SetString(2, u"ラジオボックス3")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box, flag=wx.GROW)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
それぞれのラベルが「RB2」から「ラジオボックス2」へ、「RB3」から「ラジオボックス3」へ変更されました。

要素内のボタンを無効(選択出来ない状態)もしくは有効(選択出来る状態)にするには「EnableItem」を使用します。 引数にはボタン要素のインデックスと「False(無効)」もしくは「True(有効)」を渡します。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_VERTICAL)
radio_box.EnableItem(1, False)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
「RB2」が押せない状態となっています。

ボタンへツールチップ(補足情報を載せる小さいウィンドウ)を表示させるには「SetItemToolTip」を使用します。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_VERTICAL)
radio_box.SetItemToolTip(1, "PYTHON-IZM.COM")
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
「RB2」の上にマウスカーソルを載せると、メッセージが出るようになります。

ボタンへイベントを設定するには「Bind」を使用します。 引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、呼び出す関数内部では選択されたボタンの要素名を出力しています。
# -*- coding: utf-8 -*-
import wx
def selected_button(event):
obj = event.GetEventObject()
frame.SetStatusText("Selected! " + obj.GetStringSelection())
application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, u"テストフレーム", size=(300,200))
frame.CreateStatusBar()
panel = wx.Panel(frame, wx.ID_ANY)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_VERTICAL)
radio_box.Bind(wx.EVT_RADIOBOX, selected_button)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
ボタンを選択すると、ステータスバーにそれぞれのボタンの要素名が入ります。

ボタンの選択状態の設定は、インデックスで指定する場合には「SetSelection」、要素名で指定する場合では「SetStringSelection」を使用します。 選択値を取得するには「GetSelection」および「GetStringSelection」で、インデックスで取得するか要素名で取得するかで使い分けをします。
# -*- 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)
button_array = ("RB1", "RB2", "RB3", "RB4")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, style=wx.RA_VERTICAL)
radio_box.SetSelection(0)
radio_box.SetSelection(1)
radio_box.SetStringSelection("RB3")
radio_box.SetStringSelection("RB4")
print radio_box.GetSelection()
print radio_box.GetStringSelection()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
RadioButtonと同じようにグループ内では常に1つしか選択状態とならないので、一番最後に選択設定した「RB4」が選択されている状態となります。

--出力結果--
3 RB4
「GetCount」でRadioBox内の要素数、「GetColumnCount」でRadioBox内の列数、「GetRowCount」で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)
button_array = ("RB1", "RB2", "RB3", "RB4", "RB5", "RB6", "RB7", "RB8", "RB9", "RB10")
radio_box = wx.RadioBox(panel, wx.ID_ANY, "python-izm.com", choices=button_array, majorDimension=4, style=wx.RA_HORIZONTAL)
print radio_box.GetCount()
print radio_box.GetColumnCount()
print radio_box.GetRowCount()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(radio_box)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--

--出力結果--
10 4 3
こちらも必須!必須!
