前項での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つずつ選択する事が出来ます。