Python入門から応用までの学習サイト


CheckBox

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

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

# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2")
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス3")
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス4")
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス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()

--実行結果--

wxPython_checkbox_01



先程のサンプルでは初期化時の引数にてラベル(チェックボックスに表示される文字)を指定していました。当然ラベルを変更するメソッドも用意されています。

# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2")
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス3")
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス4")
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス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」となりました。

wxPython_checkbox_02



チェックボックスを無効(ステートの変更が出来ない状態)にするには「Disable」を使用します。 それとは逆に無効状態となっているチェックボックスを有効(ステートの変更が出来る状態)へ変更するには「Enable」を使用しましょう。

# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2")
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス3")
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス4")
checkbox_5 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス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」が押せない状態となっています。

wxPython_checkbox_03



チェックボックスへツールチップ(補足情報を載せる小さいウィンドウ)を表示させるには「SetToolTipString」を使用します。

# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

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

checkbox_3.SetToolTipString("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」の上にマウスカーソルを載せると、メッセージが出るようになります。

wxPython_checkbox_04



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

# -*- coding: utf-8 -*- 

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, u"テストフレーム", size=(300,200))
frame.CreateStatusBar()

panel = wx.Panel(frame, wx.ID_ANY)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2")
checkbox_3 = wx.CheckBox(panel, 3333, u"チェックボックス3")
checkbox_4 = wx.CheckBox(panel, 4444, u"チェックボックス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()

--実行結果--

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

wxPython_checkbox_05



チェックボックスのステート(選択状態)の設定は「SetValue」を使用します。 「GetValue」もしくは「IsChecked」を使用すると、ステートの取得を行う事が出来ます。 設定・取得どちらのケースでも「True」がチェックが付いている状態で、「False」がチェックの付いていない状態となります。

# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2")
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス3")
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス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」となります。

wxPython_checkbox_06



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


    「wx.CHK_3STATE」のみを指定した場合

プログラム上では3つのステートを設定可能

ユーザー側はチェックなし・チェックありのみ設定可能


    「wx.CHK_3STATE」と「wx.CHK_ALLOW_3RD_STATE_FOR_USER」を指定した場合

プログラム上でもユーザー側でも3つのステートが利用出来る


# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2")
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス3", style=wx.CHK_3STATE)
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス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のような形で表現されます。

wxPython_checkbox_07



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

# -*- 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)
panel.SetBackgroundColour("#AFAFAF")

checkbox_1 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス1")
checkbox_2 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス2", style=wx.CHK_3STATE)
checkbox_3 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス3", style=wx.CHK_3STATE)
checkbox_4 = wx.CheckBox(panel, wx.ID_ANY, u"チェックボックス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()

--実行結果--

3ステートではないチェックボックスに対して「Set3StateValue」や「Get3StateValue」を実行すると、エラーになってしまうので注意しましょう。出力されるステートは、上から「0」「1」「2」となります。

wxPython_checkbox_08




Python
スタートブック


入門 Python 3


Effective
Python


退屈なことは
Pythonにやらせよう

 
 
 

こちらも非常によく使います!

▶GUI:RadioButton



確かな力が身につく
Python「超」入門




P  R