wx.SpinButton (wxPython) | Python-izm

SpinButton

主に数値等の値を上下させるために使用されるSpinButtonのサンプルとなります。Sliderと比べ、こちらは比較的小さい数値を扱うのに向いています。

横並びスピンボタン

sytleSP_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つのボタンが縦並びで表示されています。

値の設定・取得

スピンボタンはスライダーと違い、自分自身で値を表示出来る機能は持っていませんが、内部にきちんと値を保持しています。保持している値の設定・取得は、SetValueGetValueを使いましょう。最小値を下回る値を設定した場合は最小値に、最大値を上回る値を設定した場合は最大値へ値は変更されます。

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を利用します。最小値・最大値の設定はそれぞれSetMinSetMaxを使いましょう。

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