GUI

Python Tkinter widgets 基本的なウィジェット(7) Entry-Validation

ユーザーは、エントリーウィジェットに好きなテキストを入力することができる。しかし、入力できる文字列を制限したい場合は、バリデーションで制限できる。(例えば、整数値や郵便番号などの形式など。)

プログラムでは、エントリの有効・無効の判断基準や、 有効性をチェックするタイミングを指定することができる。

検証の基準は、エントリーの validatecommand 設定オプションで指定する。エントリの検証を行うコードを指定する。これはウィジェットのコールバックやイベントバインディングのように機能するが、 値 (エントリが有効かどうか) を返すという点が異なる。キー入力のたびにエントリを検証する。これは、validate 設定オプションに key という値を指定することで行う。

10桁の整数のみを受け付けるエントリ

import re

def validate_num(newval):
    return re.match('^[0-9]*$', newval) is not None and len(newval) <= 10

validate_num_wrapper = (root.register(validate_num), '%P')

num = StringVar()
e = ttk.Entry(root, textvariable=num, validate='key', validatecommand=validate_num_wrapper)

イベントバインディングと同様に、パーセント置換によって検証のトリガーとなった条件についてより多くの情報にアクセスできる。Pは、検証を通過したときのエントリーの新しい値。単純な正規表現と長さチェックで、その変更が有効かどうかを判断する。変更を拒否するには、検証コマンドは偽の値を返し、エントリーは変更されないままにする。

このパーセント置換を利用するには、少し工夫が必要。Tkinterはイベントバインディングコールバックにおいてパーセント置換を抽象化している。すべてのイベントパラメータはイベントオブジェクトにラップされ、コールバックに渡される。検証コールバックには同等の抽象化はない。その代わり、どのパーセント置換に興味があるかを選択する必要がある。registerメソッド(ルートだけでなく、どのウィジェットでも呼び出すことができる)は、Python関数を呼び出すTclプロシージャを作成する。パーセント置換は、パラメータとして渡される。