SpinButton
主に数値等の値を上下させるために使用されるSpinButtonのサンプルとなります。Sliderと比べ、こちらは比較的小さい数値を扱うのに向いています。
「sytle」に「SP_HORIZONTAL」を指定すると横並びのスピンボタンが配置されます。ただしデフォルトの配置方向が横並びなので、特に明示せずとも横並びで配置されます。
# -*- 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")
#spin_button = wx.SpinButton(panel)
spin_button = wx.SpinButton(panel, style=wx.SP_HORIZONTAL)
layout = wx.GridSizer(3, 1)
layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
横並びのスピンボタンです。2つのボタンがセットで表示されます。

縦並びのスピンボタンを配置する場合は「SP_VERTICAL」を指定します。
# -*- 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")
spin_button = wx.SpinButton(panel, style=wx.SP_VERTICAL)
layout = wx.GridSizer(3, 1)
layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
今度は2つのボタンが縦並びで表示されています。

スピンボタンはスライダーと違い、自分自身で値を表示出来る機能は持っていませんが、内部的にきちんと値を保持しています。 保持している値の設定・取得は、「SetValue」「GetValue」を使いましょう。 最小値を下回る値を設定した場合は最小値に、最大値を上回る値を設定した場合は最大値へ値は変更されます。
# -*- 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")
spin_button = wx.SpinButton(panel)
spin_button.SetValue(20)
print spin_button.GetValue()
layout = wx.GridSizer(3, 1)
layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--

--出力結果--
20
スピンボタンへイベントを設定するには「Bind」を使用します。 引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡しています。
# -*- coding: utf-8 -*-
import wx
def spinbutton_value_change(event):
obj = event.GetEventObject()
frame.SetStatusText("SpinButton value is " + str(obj.GetValue()))
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")
spin_button = wx.SpinButton(panel)
spin_button.Bind(wx.EVT_SPIN, spinbutton_value_change)
layout = wx.GridSizer(3, 1)
layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
左ボタン(減)・右ボタン(増)をクリックすると、ステータスバーに現在値が入るので、内部的に保持している値の上下する様子がわかると思います。

スピンボタンに設定されている最小値を取得するには「GetMin」を、最大値を取得するには「GetMax」を利用します。 最小値・最大値の設定はそれぞれ「SetMin」「SetMax」を使いましょう。
# -*- coding: utf-8 -*-
import wx
def spin_value_change(event):
obj = event.GetEventObject()
frame.SetStatusText("SpinButton value is " + str(obj.GetValue()))
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")
spin_button = wx.SpinButton(panel)
print spin_button.GetMin()
print spin_button.GetMax()
spin_button.SetMin(100)
spin_button.SetMax(500)
spin_button.Bind(wx.EVT_SPIN, spin_value_change)
layout = wx.GridSizer(3, 1)
layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10)
panel.SetSizer(layout)
frame.Show()
application.MainLoop()
--実行結果--
最小値をデフォルトの「0」から「100」へ、最大値をデフォルトの「100」から「500」へ変更しました。どれだけボタンを押しても最小値・最大値を超える事はありません。

--出力結果--
0 100
これまた便利!
