wx.RadioBox (wxPython) | Python-izm

RadioBox

前項で解説したRadioButtonの拡張版ともいえるRadioBoxの紹介です。ラジオボタンとの違いは下記の通りとなります。

  • StaticBoxSizerのようなタイトル付きボーダーで要素が囲われる
  • グループ内の値の設定・取得が容易
  • ボタン要素が動的なケースでの使用に向いている

横配置

基本的な使用方法として、BoxSizerのような横配置があります。初期化時の引数には(親ウィンドウ、識別子、ラベル、ボタン要素配列、配置方向指定)の順番で渡しています。

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')

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を指定します。

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')

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を指定します。

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')

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()

majorDimension4で設定しているので、1つの行に4つ以上は配置されません。

ラベル設定

ボタンのラベル変更を行うにはSetItemLabel、もしくはSetStringを使用します。どちらも引数に(ボタン要素のインデックス、変更後ラベル)を設定することで利用することができます。

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')
 
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, 'ラジオボックス2')
radio_box.SetString(2, 'ラジオボックス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 (有効)を渡します。

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')
 
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を使用します。

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')
 
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を使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、呼び出す関数内部では選択されたボタンの要素名を出力しています。

import wx

def selected_button(event):
    obj = event.GetEventObject()
    frame.SetStatusText('Selected! ' + obj.GetStringSelection())
        
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_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で、インデックスで取得するか要素名で取得するかで使い分けをします。

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')

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内の行数をそれぞれ取得出来ます。

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')

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