リンク

2017年6月29日木曜日

pythonでGUIツールを作る 〜SpinCtrlDouble(スピンコントロールダブル)〜


今回は、SpinCtrlに似たウィジット「SpinCtrlDouble」をご紹介します。

以前ご紹介したSpinCtrlは数値のみが入力可能で、値を上下させるボタンが初期配置されている便利なものでした。
今回の「SpinCtrlDouble」は基本的には「SpinCtrl」と同様ですが、”小数点も使える”という点が異なっています。


環境
  • macOS Sierra 10.12.5
  • python 3.4
  • wxPython 4.0.0a3


スクリプト
# -*- coding: UTF-8 -*-

import wx

class App(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(300, 300), style=wx.DEFAULT_FRAME_STYLE)

        p = wx.Panel(self, wx.ID_ANY)

        # SpinCtrl
        self.spinS = wx.SpinCtrl(p, wx.ID_ANY, size=(100, 25))

        # SpinCtrlDouble
        self.spinD = wx.SpinCtrlDouble(p, wx.ID_ANY, '0', inc=0.01, size=(100, 25))

        b = wx.Button(p, wx.ID_ANY, 'button')
        b.Bind(wx.EVT_BUTTON, self.click)

        self.text = wx.StaticText(p, wx.ID_ANY, 'クリック時の値')

        # レイアウト
        layout = wx.BoxSizer(wx.VERTICAL)
        layout.Add(self.spinS, flag=wx.ALL, border=10)
        layout.Add(self.spinD, flag=wx.ALL, border=10)
        layout.Add(b, flag=wx.ALL, border=10)
        layout.Add(self.text, flag=wx.ALL, border=10)

        p.SetSizer(layout)

        self.Show()

    def click(self, event):
        self.text.SetLabel(str(self.spinD.GetValue()))


if __name__ == "__main__":
    app = wx.App()
    App(None, wx.ID_ANY, 'タイトル')
    app.MainLoop()


実行結果
実行直後は違いがわかりませんが、上が「SpinCtrl」で下が「SpinCtrlDouble」です。


動かしているところ。


解説
# SpinCtrlDouble
self.spinD = wx.SpinCtrlDouble(p, wx.ID_ANY, '0', inc=0.01, size=(100, 25))
ここでインスタンス化を行なっています。
この時の引数は(親ウィジット、ID、初期値、インクリメント値、サイズ)です。

インクリメントというのは「増加」という意味ですが、ここでは「1クリックごとの増減値」を意味する言葉として使用しています。
今回はインクリメント値に「0.01」を指定していますので、上下のボタンをクリックするたびに現在の値から0.01ずつ増減します。


メソッド紹介
基本的にはSpinCtrlと同様のメソッドを使用することができます。
# 現在値を取得する
self.spinD.GetValue()

# 設定されている最小値を取得する
self.spinD.GetMin()

# 設定されている最大値を取得する
self.spinD.GetMax()

# 設定されている最小値と最大値を取得する
self.spinD.GetRange()

# 設定されているインクリメント値を取得する
self.spinD.GetIncrement()

# 値を設定する
self.spinD.SetValue(0.2)

# 最小値を設定する
self.spinD.SetMin(0.2)

# 最大値を設定する
self.spinD.SetMax(50.0)

# 最小値と最大値を設定する
self.spinD.SetRange(10.0, 50.0)

# インクリメント値を設定する
self.spinD.SetIncrement(0.03)


まとめ
「SpinCtrl」「SpinCtrlDouble」はどちらもユーザーに数値のみの入力を強制させるためのウィジットです。
通常の使用であれば「SpinCtrl」で十分だとは思いますが、必ず小数点で入力しなければいけないような場面では「SpinCtrlDouble」を使うようにしましょう。


0 件のコメント:

コメントを投稿