Tkinter Entry の入力検証
入力検証とは?
ここでは Tkinter の ttk.Entry ウィジェットでの入力検証方法について説明します。
入力検証とは、Entry への入力値が適切であるかチェックするということです。
例えば、次の例では Username として 5 文字未満の場合は不正であるとします。Entry に 5 文字以上入力されたら OK ボタンが有効にしたいとしましょう。
この場合、キーを押したときに入力検証用の関数が呼ばれるようにしておき、入力値が 5 文字以上の時にボタンを有効化します。
ttk.Entry の入力検証用の validatecommand
ttk.Entry ウィジェットは入力検証を行うための validatecommand オプションがあります。
validatecommand に指定する関数には、次のパラメータが渡せます。
% 値 | 意味 |
---|---|
%d | アクションのタイプ。文字の挿入の場合 1。削除の場合 0。再検証の場合 -1 |
%i | 挿入または削除された文字のインデックス |
%P | Entry の新しい値 |
%s | 編集前の Entry の値 |
%S | 挿入または削除される文字 |
%v | validate オプションの現在の値 |
%V | 検証の条件 (モード) |
%W | Entry ウィジェットの名前 |
具体的なサンプルコードで説明します。
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 の入力検証方法について説明しました。