本項で紹介するのはToggleButton(トグルボタン)です。見た目は普通のボタンと変わりませんが、ON、OFFの状態を設定出来るので、機能としてはチェックボックスに近いものがあります。
基本的な使い方
パネルへトグルボタンを追加しています。引数には(親ウィンドウ、識別子、ラベル)の順番で渡しています。
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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
トグルボタンをクリックするとONの状態となり見た目が少し変わります。

ラベル設定
ラベル(トグルボタンに表示される文字)を変更するにはSetLabelを使用します。
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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
t_button_2.SetLabel('togglebutton2')
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
t_button_2のラベルがトグルボタン2ではなくtogglebutton2となりました。

ボタンサイズ設定
トグルボタンのサイズを変更するにはsizeを渡します。SetSize、SetMaxSize、SetMinSizeでも設定可能ですが、Sizerの設定に依存する場合もあるので注意しましょう。
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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2', size=(150, 50))
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
# t_button_2.SetSize((150, 50))
# t_button_2.SetMaxSize((150, 50))
# t_button_2.SetMinSize((150, 50))
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
サイズ変更をしたトグルボタン2のみ大きさが違います。

フォント設定
トグルボタンのフォント(文字の大きさや太字設定)を変更するにはSetFontを使用します。
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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)
t_button_2.SetFont(font)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
トグルボタン2の文字の大きさを変更しました。

有効・無効設定
トグルボタンを無効(押せない状態)にするには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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
t_button_2.Disable()
# t_button_2.Enable()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
トグルボタン2が押せない状態となっています。

ツールチップ設定
トグルボタンへツールチップ(補足情報を載せる小さいウィンドウ)を表示させるには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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
t_button_2.SetToolTip('python-izm.com')
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
トグルボタン2の上にマウスカーソルを載せると、メッセージが出るようになります。

表示・非表示設定
トグルボタンを非表示にするにはHideを使用しましょう。非表示状態のトグルボタンを表示させるにはShowを用います。なおトグルボタンは「見えない」だけで本体は存在しています。非表示状態のボタンに対してラベル設定をしたりする事も可能です。
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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
t_button_2.Hide()
# t_button_2.Show()
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
トグルボタン2が隠れています。見えないだけなのでプログラム上で操作してもエラーとはなりません。

イベント設定
トグルボタンへイベントを設定するにはBindを使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡し、トグルボタン1とトグルボタン2ではそれぞれ違う関数を定義してイベント設定しています。トグルボタン3とトグルボタン4では、引数にイベント発生元を追加し、トグルボタン初期化時のIDで判別して挙動を変えています。なおサンプルでもあるように、トグルボタン・フレームのどちらにBindしてもイベントはきちんと動作します。
import wx
def click_togglebutton_1(event):
frame.SetStatusText('Click! t_button_1')
def click_togglebutton_2(event):
frame.SetStatusText('Click! t_button_2')
def click_togglebutton(event):
if event.GetId() == 1234:
frame.SetStatusText('Click! t_button_3')
elif event.GetId() == 5678:
frame.SetStatusText('Click! t_button_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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, 1234, 'トグルボタン3')
t_button_4 = wx.ToggleButton(panel, 5678, 'トグルボタン4')
t_button_1.Bind(wx.EVT_TOGGLEBUTTON, click_togglebutton_1)
t_button_2.Bind(wx.EVT_TOGGLEBUTTON, click_togglebutton_2)
frame.Bind(wx.EVT_TOGGLEBUTTON, click_togglebutton, t_button_3)
frame.Bind(wx.EVT_TOGGLEBUTTON, click_togglebutton, t_button_4)
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
layout.Add(t_button_4)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
トグルボタンを押すと、ステータスバーにそれぞれ違ったメッセージが入ります。

ステートの設定・取得
トグルボタンのステート(ON・OFF状態)の設定はSetValueを使用し、取得はGetValueを使用します。設定・取得どちらのケースでもTrueがONの状態で、FalseがOFFの状態となります。
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')
t_button_1 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン1')
t_button_2 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン2')
t_button_3 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン3')
t_button_4 = wx.ToggleButton(panel, wx.ID_ANY, 'トグルボタン4')
t_button_1.SetValue(True)
t_button_2.SetValue(True)
t_button_3.SetValue(False)
t_button_4.SetValue(False)
print(t_button_1.GetValue())
print(t_button_2.GetValue())
print(t_button_3.GetValue())
print(t_button_4.GetValue())
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(t_button_1)
layout.Add(t_button_2)
layout.Add(t_button_3)
layout.Add(t_button_4)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
printで出力されるステートは、上からTrue、True、False、Falseとなります。
