Tkinter Entry の入力検証

入力検証とは?

ここでは Tkinter の ttk.Entry ウィジェットでの入力検証方法について説明します。

入力検証とは、Entry への入力値が適切であるかチェックするということです。

例えば、次の例では Username として 5 文字未満の場合は不正であるとします。Entry に 5 文字以上入力されたら OK ボタンが有効にしたいとしましょう。

Tkinter input validation demo

この場合、キーを押したときに入力検証用の関数が呼ばれるようにしておき、入力値が 5 文字以上の時にボタンを有効化します。

ttk.Entry の入力検証用の validatecommand

ttk.Entry ウィジェットは入力検証を行うための validatecommand オプションがあります。

validatecommand に指定する関数には、次のパラメータが渡せます。

% 値 意味
%dアクションのタイプ。文字の挿入の場合 1。削除の場合 0。再検証の場合 -1
%i挿入または削除された文字のインデックス
%PEntry の新しい値
%s編集前の Entry の値
%S挿入または削除される文字
%vvalidate オプションの現在の値
%V検証の条件 (モード)
%WEntry ウィジェットの名前

具体的なサンプルコードで説明します。

from tkinter import *
from tkinter import ttk


def validate_username(d, i, P, s, S, v, V, W):
    print(f'{d}, {i}, {P}, {s}, {S}, {v}, {V}, {W}')
    if len(P) < 5:
        button1['state'] = 'disabled'
    else:
        button1['state'] = 'normal'
    return True


if __name__ == '__main__':
    root = Tk()
    ttk.Style().theme_use('classic')
    root.title('Entry Test')
    root.resizable(False, False)
    frame1 = ttk.Frame(root, padding=(32))
    frame1.grid()

    label1 = ttk.Label(frame1, text='Username', padding=(5, 2))
    label1.grid(row=0, column=0, sticky=E)

    label2 = ttk.Label(frame1, text='Password', padding=(5, 2))
    label2.grid(row=1, column=0, sticky=E)

    # Username Entry
    username = StringVar()
    val_cmd = root.register(validate_username)
    username_entry = ttk.Entry(
        frame1,
        textvariable=username,
        validatecommand=(val_cmd, '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'),
        validate='all',
        width=20, exportselection=1)
    username_entry.grid(row=0, column=1)

    # Password Entry
    password = StringVar()
    password_entry = ttk.Entry(
        frame1,
        textvariable=password,
        width=20,
        show='*')
    password_entry.grid(row=1, column=1)

    frame2 = ttk.Frame(frame1, padding=(0, 5))
    frame2.grid(row=2, column=1, sticky=W)

    button1 = ttk.Button(
        frame2, text='OK', state='disabled',
        command=lambda: print("%s,%s" % (username.get(), password.get())))
    button1.pack(side=LEFT)

    button2 = ttk.Button(frame2, text='Cancel', command=quit)
    button2.pack(side=LEFT)

    root.mainloop()

ここで、validatecommand でコールバックされる関数を 5行目から11行目で定義しています。

入力した文字は全て受け入れることにするので、常に True を返しています。

もし、アルファベットのみを受け付ける場合には、アルファベット以外の文字が入力された場合に False を返します。

30行目でコールバック関数を登録しています。

34行目で Entry ウィジェットの validatecommand オプションに、コールバック関数とパラメータを指定しています。 ここでは上の表で説明した全てのパラメータを受け取ることにしています。

Entry の validate オプション

Entry の validate オプションは検証モード、つまり、検証するタイミングを指定します。

指定可能な値は none, focus, focusin, focusout, key, all です。

例えばキー入力をするたびに、validatecommand のコールバック関数を呼ぶなら、validate オプションは key にします。

Entry の invalidcommand オプションには、入力検証用のコールバック関数が False を返した時に呼ばれるコールバック関数を指定します。

コールバック関数のパラメータ、設定方法などは、validatecommand と同様です。

以上で、Entry の入力検証方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Python 入門