wx.RadioButton (wxPython) | Python-izm

RadioButton

前項での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つしか選択する事が出来ませんでした。別の選択肢を作成する場合はstyleRB_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つずつ選択する事が出来ます。