CheckBox

本項ではCheckBoxを扱います。GUIアプリケーションではかなりの頻度で使用され複数の選択肢の中から該当するものを1つ以上選択するケースで利用します。

基本的な使い方

パネルへチェックボックスを追加しています。引数には(親ウィンドウ、識別子、ラベル)の順番で渡しています。

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

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3')
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4')
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス5')

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)
layout.Add(checkbox_5, 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')

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3')
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4')
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス5')

checkbox_3.SetLabel('CheckBox3')

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)
layout.Add(checkbox_5, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

checkbox_3のラベルがチェックボックス3ではなくCheckBox3となりました。

有効・無効設定

チェックボックスを無効(ステートの変更が出来ない状態)にするには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')

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3')
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4')
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス5')

checkbox_3.Disable()
# checkbox_3.Enable()

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)
layout.Add(checkbox_5, 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')

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3')
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4')
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス5')

checkbox_3.SetToolTip('python-izm.com')

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)
layout.Add(checkbox_5, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

チェックボックス3の上にマウスカーソルを載せると、メッセージが出るようになります。

イベント設定

チェックボックスへイベントを設定するにはBindを使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡しチェックボックス1チェックボックス2ではそれぞれ違う関数を定義してイベント設定しています。チェックボックス3チェックボックス4では、引数にイベント発生元を追加し、チェックボックス初期化時のIDで判別して挙動を変えています。なおサンプルでもあるように、チェックボックス・フレームのどちらにBindしてもイベントはきちんと動作します。

import wx

def state_change_checkbox_1(event):
    frame.SetStatusText('StateChange! checkbox_1')

def state_change_checkbox_2(event):
    frame.SetStatusText('StateChange! checkbox_2')

def state_change_checkbox(event):
    if event.GetId() == 3333:
        frame.SetStatusText('StateChange! checkbox_3')
    elif event.GetId() == 4444:
        frame.SetStatusText('StateChange! checkbox_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')

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, 3333, 'チェックボックス3')
checkbox_4 = wx.CheckBox(panel, 4444, 'チェックボックス4')

checkbox_1.Bind(wx.EVT_CHECKBOX, state_change_checkbox_1)
checkbox_2.Bind(wx.EVT_CHECKBOX, state_change_checkbox_2)
frame.Bind(wx.EVT_CHECKBOX, state_change_checkbox, checkbox_3)
frame.Bind(wx.EVT_CHECKBOX, state_change_checkbox, checkbox_4)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

チェックボックスのステートを変更すると、ステータスバーにそれぞれ違ったメッセージが入ります。

ステートの設定・取得

チェックボックスのステート(選択状態)の設定はSetValueを使用します。GetValueもしくはIsCheckedを使用すると、ステートの取得を行う事が出来ます。設定・取得どちらのケースでも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')

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3')
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4')

checkbox_1.SetValue(True)
checkbox_2.SetValue(True)
checkbox_3.SetValue(False)
checkbox_4.SetValue(False)

print(checkbox_1.GetValue())
print(checkbox_2.IsChecked())
print(checkbox_3.GetValue())
print(checkbox_4.IsChecked())

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

出力されるステートは、上からTrue、True、False、Falseとなります。

3ステートチェックボックス

近年のGUIアプリケーションでもしばしば見られるような、3つのステート(チェックなし・チェックあり・中間)を保持出来るチェックボックスも使用可能です。デフォルトでは2ステートチェックボックスなので、必要に応じて使い分けましょう。なお3ステートチェックボックスには2つのモードが存在するので違いを記載しておきます。

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

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2')
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3', 
                         style=wx.CHK_3STATE)
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4', 
                         style=wx.CHK_3STATE | wx.CHK_ALLOW_3RD_STATE_FOR_USER)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

チェックボックス3はクリックしてもチェックなしチェックありのみで中間ステートが出現しません(プログラム上では設定可能)。中間はチェックボックス4のような形で表現されます。

ステートの設定・取得(3ステート)

3ステートチェックボックスでは、ステートの設定・取得方法が2ステートチェックボックスとは異なります。チェックなし0チェックあり1中間2で判別されるので注意しましょう。

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

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス1')
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス2',
                         style=wx.CHK_3STATE)
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス3',
                         style=wx.CHK_3STATE)
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, 'チェックボックス4',
                         style=wx.CHK_3STATE | wx.CHK_ALLOW_3RD_STATE_FOR_USER)

checkbox_2.Set3StateValue(0)
checkbox_3.Set3StateValue(1)
checkbox_4.Set3StateValue(2)

# print(checkbox_1.Get3StateValue())
print(checkbox_2.Get3StateValue())
print(checkbox_3.Get3StateValue())
print(checkbox_4.Get3StateValue())

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(checkbox_1, flag=wx.GROW)
layout.Add(checkbox_2, flag=wx.GROW)
layout.Add(checkbox_3, flag=wx.GROW)
layout.Add(checkbox_4, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

旧バージョンのwxPythonでは、3ステートではないチェックボックスに対してSet3StateValueGet3StateValueを実行すると、エラーになってしまうので注意しましょう。出力されるステートは、上から0、1、2となります。