Entryとは
Windiowsではエディットボックスなどと呼ばれキーボードから文字を入力するためのウェジットです。
エントリーがチェックボタンやラジオボタンと異なるのは入力データが適切かを検証することがあります。お馴染みなのはパスワードは「8文字以上にしてください。」などです。最初は何も検証のないコードです。
import tkinter as tk
def main():
root = tk.Tk()
root.title('Entry')
root.geometry("200x100")
lblId = tk.Label(root, text='UserId')
lblId.grid(row=0, column=0)
lblPass = tk.Label(root, text='Password')
lblPass.grid(row=1, column=0)
# Username Entry
UserId = tk.StringVar()
id_entry = tk.Entry(
root,
textvariable=UserId,
width=20)
id_entry.grid(row=0, column=1)
# Password Entry
password = tk.StringVar()
pass_entry = tk.Entry(
root,
textvariable=password,
width=20,
show='*')
pass_entry.grid(row=1, column=1)
btnOk = tk.Button(
root, text='OK',
command=lambda: print("%s,%s" % (UserId.get(), password.get())))
btnOk.grid(row=3, column=0)
btnCancel = tk.Button(root, text='Cancel', command=quit)
btnCancel.grid(row=3, column=1)
root.mainloop()
if __name__ == "__main__":
main()
パスワードの入力では入力文字の表示を*にしてます。
show='*'
入力の検証
次に入力の検証です。検証のやり方は、
①OKボタンが押されたときに検証する ②キー入力された時、検証する 上記2つの方法があります。Tkinterでは②はコールバッグ関数で対応できます。パスワードの検証をします。
8文字以上の長さで文字は数字のみ有効とします。
import tkinter as tk
import re
def validate_password( P):
#print(f'{d}, {i}, {P}, {s}, {S}, {v}, {V}, {W}')
print(P)
if len(P) < 8:
btnOk['state'] = 'disabled'
else:
result = re.sub('\d', '', P)
if len(result) == 0:
btnOk['state'] = 'normal'
else:
btnOk['state'] = 'disabled'
return True
if __name__ == "__main__":
root = tk.Tk()
root.title('Entry')
root.geometry("200x100")
lblId = tk.Label(root, text='UserId')
lblId.grid(row=0, column=0)
lblPass = tk.Label(root, text='Password')
lblPass.grid(row=1, column=0)
# Username Entry
UserId = tk.StringVar()
id_entry = tk.Entry(
root,
textvariable=UserId,
width=20)
id_entry.grid(row=0, column=1)
# Password Entry
validate_cmd = root.register(validate_password)
password = tk.StringVar()
pass_entry = tk.Entry(
root,
textvariable=password,
# validatecommand=(validate_cmd, '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'),
validatecommand=(validate_cmd, '%P'),
# validate='all',
validate='key',
width=20,
show='*')
pass_entry.grid(row=1, column=1)
btnOk = tk.Button(
root, text='OK',
state='disabled',
command=lambda: print("%s,%s" % (UserId.get(), password.get())))
btnOk.grid(row=3, column=0)
btnCancel = tk.Button(root, text='Cancel', command=quit)
btnCancel.grid(row=3, column=1)
root.mainloop()
正規表現をつかうためのインポートです。
import re コールバック関数です。
validate_password( P):
Pは現在の入力文字です。
1から0の数字を削除します。全部数字なら文字の長さが0になることで全部数字か?を判定します。
result = re.sub('\d', '', P)
今回if __name__ == "__main__"以下にメインのコードを書いています。これはコールバック関数がbtnOkが使えるようにしました。
グローバル変数でも対応できます。
validate_cmd = root.register(validate_password)
コールバック関数を validatecommandに設定するための処理です。
validatecommand=(validate_cmd,%P')
btnOkにコールバック関数が実装されました。
%値 |
意味 |
%d |
1:挿入 0::削除 |
%i |
挿入または削除された文字の位置 |
%P |
新しい文字列 |
%s |
以前の文字列 |
%S |
挿入または削除される文字 |
%v |
validateのオプション allなど |
%V |
検証モード focusin, key, focusoutなど |
%W |
Entryの名前 |
validate='key'
キーボードが押されるごとにコールバック関数が呼び出されます。
以下のオプションが使用可能。
none, focus, focusin, focusout, key, all |