wx.Slider (wxPython) | Python-izm

Slider

数値を指定する際に使用されるSliderのサンプルです。RGBの設定などでよく見かけるように、比較的範囲の大きい数値指定に向いていると言えるでしょう。

横方向スライダー

sytleSL_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')

slider = wx.Slider(panel, style=wx.SL_HORIZONTAL)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

最も一般的な横方向スライダーです。

縦方向スライダー

縦方向スライダーを配置する場合はSL_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')

slider = wx.Slider(panel, style=wx.SL_VERTICAL)

layout = wx.BoxSizer(wx.HORIZONTAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

上部が最小値、下部が最大値となります。

状態ラベル表示

SL_LABELSを指定すると、スライダー上部にラベルが表示されるようになります。左から設定されている最小値現在の値設定されている最大値となります。

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')

slider = wx.Slider(panel, style=wx.SL_LABELS)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

下図の場合、最小値が0、最大値が100、現在の値が75となります。

目盛り表示

ある程度の目安となる目盛りを表示させるにはSL_AUTOTICKSを指定します。デフォルトの目盛り幅は最小で設定されるので、設定変更を行う場合はSetTickFreqを使いましょう。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))

panel = wx.Panel(frame, wx.ID_ANY)

slider = wx.Slider(panel, style=wx.SL_AUTOTICKS)
slider.SetTickFreq(10)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

目盛り幅を10で設定しています。

参考としてデフォルトの目盛り幅も掲載しておきます。

複合スタイル

先程紹介したスタイルを複数指定するには「 | 」を使用します。

import wx

application = wx.App()
frame = wx.Frame(None, wx.ID_ANY, 'テストフレーム', size=(300, 200))

panel = wx.Panel(frame, wx.ID_ANY)

slider = wx.Slider(panel, style=wx.SL_VERTICAL | wx.SL_LABELS | wx.SL_AUTOTICKS)

layout = wx.BoxSizer(wx.HORIZONTAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

縦方向、状態ラベル表示、目盛り表示を指定しました。

最大値と最小値

スライダーに設定されている最小値を取得するにはGetMinを、最大値を取得するにはGetMaxを利用します。最小値・最大値の設定はそれぞれSetMinSetMaxを使いましょう。

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')

slider = wx.Slider(panel, style=wx.SL_LABELS)

print(slider.GetMin())
print(slider.GetMax())
slider.SetMin(100)
slider.SetMax(500)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

最小値を0から100へ、最大値を100から500へ変更しました。

0
100

値の設定・取得

スライダー値の設定・取得は、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')

slider = wx.Slider(panel, style=wx.SL_LABELS)

slider.SetValue(20)
print(slider.GetValue())

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

20

イベント設定

スライダーへイベントを設定するにはBindを使用します。引数には(イベント種別、イベント発生時に呼び出す関数)の順番で値を渡しています。

import wx

def slider_value_change(event):
    obj = event.GetEventObject()
    frame.SetStatusText('Slider 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')

slider = wx.Slider(panel)

slider.Bind(wx.EVT_SLIDER, slider_value_change)

layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(slider, flag=wx.GROW)

panel.SetSizer(layout)

frame.Show()
application.MainLoop()

スライダーの値を変更すると、ステータスバーに現在値が入ります。