Python 入門

ホーム > Tkinter による GUI プログラミング > スピンボックス・ウィジェットの使い方

スピンボックス・ウィジェットの使い方

ここではスピンボックスの使い方について説明します。

スピンボックスは、スピナーなどと呼ばれているウィジェットで、エディットボックスに数字を段階的に変更するための上下矢印ボタンが付属しているものです。

しかしながら、Spinbox は特に何も入力制限をしないと、自由に文字が入力できるので、下のコードでは簡単な入力検証を実装しています。具体的には数字でない場合にそれを "0" に置き換えるようにしています。

from tkinter import *
from tkinter import ttk

def spin_changed(*args):
    print('value = %s' % spinval.get())
    if spinval.get().isnumeric():
        s = spinval.get()
        i = int(s)
        spinval.set(i)
    else:
        spinval.set("0")
    
if __name__ == '__main__':
    
    root = Tk()
    root.title('Spinbox')
    root.columnconfigure(0, weight=1);
    root.rowconfigure(0, weight=1);
    
    # Frame
    frame1 = ttk.Frame(root, padding=10)
    frame1.grid(sticky=(N,W,S,E))
    frame1.columnconfigure(0, weight=1);
    frame1.rowconfigure(0, weight=1);
    
    # スピンボックス
    spinval = StringVar()
    spinval.trace("w", spin_changed)
    
    sp = Spinbox(
        frame1,
        textvariable=spinval,
        from_=0,
        to=10)
    sp.grid(row=0, column=0, sticky=(N, W))
        
    root.mainloop()

スピンボックスへの入力値は textvariable オプションと関連付けできます。

textvariable オプションに StringVar オブジェクトを関連付け、StringVar オブジェクトの書き込みトレースのコールバックで、入力検証しています。

今回は数字の値だけを受けとるようにしたいので、isnumeric() が True ではない場合に、StringVar オブジェクトの値を書き換えています。これによってスピンボックス上に表示される値も書き換わります。

また、スピンボックスの from_to で指定した範囲は、 スピンボックスの上下ボタンの上限値、下限値にのみ影響するだけなので注意が必要です。

ホーム > Tkinter による GUI プログラミング > スピンボックス・ウィジェットの使い方