主に数値等の値を上下させるために使用されるSpinButtonのサンプルとなります。Sliderと比べ、こちらは比較的小さい数値を扱うのに向いています。
横並びスピンボタン
sytleにSP_HORIZONTALを指定すると横並びのスピンボタンが配置されます。ただしデフォルトの配置方向が横並びなので、特に明示せずとも横並びで配置されます。
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') spin_button = wx.SpinButton(panel, style=wx.SP_HORIZONTAL) layout = wx.GridSizer(rows=3, cols=1, gap=(0, 0)) layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10) panel.SetSizer(layout) frame.Show() application.MainLoop()
横並びのスピンボタンです。2つのボタンがセットで表示されます。
縦並びスピンボタン
縦並びのスピンボタンを配置する場合はSP_VERTICALを指定します。
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') spin_button = wx.SpinButton(panel, style=wx.SP_VERTICAL) layout = wx.GridSizer(rows=3, cols=1, gap=(0, 0)) layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10) panel.SetSizer(layout) frame.Show() application.MainLoop()
2つのボタンが縦並びで表示されています。
値の設定・取得
スピンボタンはスライダーと違い、自分自身で値を表示出来る機能は持っていませんが、内部にきちんと値を保持しています。保持している値の設定・取得は、SetValue、GetValueを使いましょう。最小値を下回る値を設定した場合は最小値に、最大値を上回る値を設定した場合は最大値へ値は変更されます。
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') spin_button = wx.SpinButton(panel) spin_button.SetValue(20) print(spin_button.GetValue()) layout = wx.GridSizer(rows=3, cols=1, gap=(0, 0)) layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10) panel.SetSizer(layout) frame.Show() application.MainLoop()
20
イベント設定
スピンボタンへイベントを設定するにはBindを使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡しています。
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, 'テストフレーム', 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(rows=3, cols=1, gap=(0, 0)) layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10) panel.SetSizer(layout) frame.Show() application.MainLoop()
左ボタン(減)・右ボタン(増)をクリックすると、ステータスバーに現在値が入るので、内部的に保持している値の上下する様子がわかると思います。
最大値と最小値
スピンボタンに設定されている最小値を取得するにはGetMinを、最大値を取得するにはGetMaxを利用します。最小値・最大値の設定はそれぞれSetMin、SetMaxを使いましょう。
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, 'テストフレーム', 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(rows=3, cols=1, gap=(0, 0)) layout.Add(spin_button, flag=wx.GROW | wx.ALL, border=10) panel.SetSizer(layout) frame.Show() application.MainLoop()
最小値を0から100へ、最大値を100から500へ変更しました。どれだけボタンを押しても最小値・最大値を超える事はありません。
0 100