【コード付】Tkinterのentryを使った入力制限の方法をお伝えします
今回はTkinterのentryでよく使われる、入力制限の方法をコードを交えてお伝え致します。entryを使った入力制限を学びたい、コードを踏まえてentryの理解を深めたい方へおすすめです。ぜひ最後までご確認ください。
執筆者 - おすすめの記事3選
Tkinterのentryで使われる入力制限とは?
まずは簡単にTkinterのentryに関して説明致します。
Tkinterのentryとは、Widgetの一種でWebページやアプリの会員登録、お問い合わせ画面などで利用されるテキストボックス を意味します。
別名entry Widgetと呼ばれます。
要するにentryの入力制限とは、テキストボックスに入力される文字を制限することを意味します。
Tkinterのentryに関して詳しく学びたい方は、Tkinterで使われるentryって?有効な活用方法を徹底解説!?をご確認ください。
入力制限を行う目的
それではなぜ入力制限を行うのでしょう?
入力制限を行う目的として、
- 利用者からの意図しない文字入力を防ぐ
- 不適切な入力のために、再度文字入力する負担をなくす
- 意図しないデータを保存してしまい、不具合を起こす可能性を減らす
が挙げられます。
確かに一度入力して、不十分なために再度入力するのは不便ですよね。。
入力制限を行う際の2つのポイント
入力制限を行う際は、
- どのタイミングで入力制限の条件を確認するのか?
- どのような入力制限の条件を設けて検証するのか?
の2点を考える必要があります。
それぞれどのように実装するのか、entryとの関係性を確認しながら見ていきましょう。
どのタイミングで入力制限の条件を確認するのか?
entryのvalidate optionへ特定の文字列を記述すると、どのタイミングで入力制限の条件を確認するのか、設定できます。
特定の文字列と役割に関しては、以下の表をご確認ください。
特定の文字列 | 役割 | 記述例 |
---|---|---|
none | 入力制限の条件を確認しない = 入力制限を設けない。デフォルト。 | tk.Entry(validate='none') |
focus | entry(テキストボックス)へカーソルがあたった、カーソルが外れた場合に、入力制限の条件を確認する。 | tk.Entry(validate='focus') |
focusin | entry(テキストボックス)へカーソルがあたった場合に入力制限の条件を確認する。 | tk.Entry(validate='focusin') |
focusout | entry(テキストボックス)へカーソルが外れた場合に入力制限の条件を確認する。 | tk.Entry(validate='focusout') |
key | entry(テキストボックス)へ文字の追加、削除が行われた場合に、入力制限の条件を確認する。 | tk.Entry(validate='key') |
all | focus, focusin, focusout, keyの役割全て。 | tk.Entry(validate='all') |
どのような入力制限の条件を設けて検証するのか?
どのような入力制限の条件を設けて検証するのかを実装するためには
- 入力制限の条件を設けて検証する関数の名前を決める
- 1で決めた関数名を、register関数を用いて登録する
- entryのvalidatecommand option or vcmd optionへ、2の戻り値とパラメータを渡す
- 入力制限の条件を設けて検証する関数を実装する
のステップが必要になります。
文章だけでは少し理解が難しいと思いますので、次の章の「【サンプルコード付】おすすめの入力制限を3つ紹介」を確認して、もう一度「どのような入力制限の条件を設けて検証するのか?」以下を読み返すことをおすすめします。
パラメータと役割に関しては、以下の表をご確認ください。
パラメータ | 役割 | 記述例 |
---|---|---|
%d | entry(テキストボックス)の操作内容(1=insert(文字を追加した), 0=delete(文字を削除した), -1(その他))をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%d')) or tk.Entry(vcmd=('register関数の戻り値', '%d')) |
%i | entry(テキストボックス)に挿入 / 削除される文字の位置をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%i')) or tk.Entry(vcmd=('register関数の戻り値', '%i')) |
%P | 現在entry(テキストボックス)に格納される、文字列をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%P')) or tk.Entry(vcmd=('register関数の戻り値', '%P')) |
%s | 現在entry(テキストボックス)に格納される、1つ前の文字列をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%s')) or tk.Entry(vcmd=('register関数の戻り値', '%s')) |
%S | entry(テキストボックス)へ入力した時の文字(挿入/削除する文字)をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%S')) or tk.Entry(vcmd=('register関数の戻り値', '%S')) |
%v | entry(テキストボックス)のvalidate optionの値(特定の文字列)をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%v')) or tk.Entry(vcmd=('register関数の戻り値', '%v')) |
%V | entry(テキストボックス)を操作することでトリガーされた、entry(テキストボックス)のvalidate optionの値(特定の文字列)をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%V')) or tk.Entry(vcmd=('register関数の戻り値', '%V')) |
%W | 現在利用中のWidgetの種類をパラメータとして渡す。 | tk.Entry(validatecommand=('register関数の戻り値', '%W')) or tk.Entry(vcmd=('register関数の戻り値', '%W')) |
【サンプルコード付】おすすめの入力制限を3つ紹介
今回の章では、おすすめの入力制限を3つ紹介したいと思います。
小文字のみ入力可能
1import tkinter as tk
2
3class Application(tk.Frame):
4 # entry Widget用変数
5 entry = None
6
7 # 入力制限に失敗した場合に呼ばれる関数
8 def invalidText(self):
9 print('入力に失敗しました。')
10
11 # 1. 入力制限の条件を設けて検証する関数の名前を決める
12 # 4. 入力制限の条件を設けて検証する関数を実装する
13 # 入力された文字が大文字ならば、"入力不正"とみなし、entry(テキストボックス)へ入力された文字を追加しない。
14 # 入力された文字が大文字ならば、ブザーを鳴らす。
15 def onValidate(self, S):
16 # 入力された文字が小文字の場合
17 if S == S.lower():
18 return True
19 # 入力された文字が大文字の場合
20 else:
21 # 入力不正のブザーを鳴らす。
22 self.bell()
23 return False
24
25 def __init__(self, master=None):
26 # Windowの初期設定を行う。
27 super().__init__(master)
28
29 # Windowの画面サイズを設定する。
30 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
31 self.master.geometry("300x200")
32
33 # Windowを親要素として、frame Widget(Frame)を作成する。
34 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
35 frame = tk.Frame(self.master)
36
37 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
38 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
39 frame.pack()
40
41 # 2. 1で決めた関数名を、register関数を用いて登録する
42 # register : 入力制限を行うための関数の登録を行う。パラメータと関数を紐づけるために必要。
43 vcmd = self.register(self.onValidate)
44
45 # frame Widget(Frame)を親要素として、entry Widgetを作成する。
46 # width : 幅の設定
47 # validate : 入力制限するオプションの値を設定。
48 # validatecommand or vcmd : 入力制限用関数の設定。(3. entryのvalidatecommand option or vcmd optionへ、2の戻り値とパラメータを渡す)
49 # invalidcommand : 入力制限により、入力不正が発生した場合に呼ばれる関数の設定。
50 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/
51 self.entry = tk.Entry(frame, width=15, validate="key", validatecommand=(vcmd, '%S'), invalidcommand=self.invalidText)
52
53 # frame Widget(Frame)を親要素とした場合に、entry Widgetをどのように配置するのか?
54 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
55 self.entry.pack()
56
57# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
58if __name__ == "__main__":
59 # Windowを生成する。
60 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
61 root = tk.Tk()
62 app = Application(master=root)
63 # Windowをループさせて、継続的にWindow表示させる。
64 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
65 app.mainloop()
半角数字のみ入力可能
1import tkinter as tk
2import re
3
4class Application(tk.Frame):
5 # entry Widget用変数
6 entry = None
7
8 # 入力制限に失敗した場合に呼ばれる関数
9 def invalidText(self):
10 print('入力に失敗しました。')
11
12 # 1. 入力制限の条件を設けて検証する関数の名前を決める
13 # 4. 入力制限の条件を設けて検証する関数を実装する
14 def onValidate(self, S):
15 # 入力された文字が半角数字の場合
16 # reについて : https://note.nkmk.me/python-re-match-search-findall-etc/
17 if re.match(re.compile('[0-9]+'), S):
18 return True
19 else:
20 # 入力不正のブザーを鳴らす。
21 self.bell()
22 return False
23
24 def __init__(self, master=None):
25 # Windowの初期設定を行う。
26 super().__init__(master)
27
28 # Windowの画面サイズを設定する。
29 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
30 self.master.geometry("300x200")
31
32 # Windowを親要素として、frame Widget(Frame)を作成する。
33 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
34 frame = tk.Frame(self.master)
35
36 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
37 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
38 frame.pack()
39
40 # 2. 1で決めた関数名を、register関数を用いて登録する
41 # register : 入力制限を行うための関数の登録を行う。パラメータと関数を紐づけるために必要。
42 vcmd = self.register(self.onValidate)
43
44 # frame Widget(Frame)を親要素として、entry Widgetを作成する。
45 # width : 幅の設定
46 # validate : 入力制限するオプションの値を設定。
47 # validatecommand or vcmd : 入力制限用関数の設定。(3. entryのvalidatecommand option or vcmd optionへ、2の戻り値とパラメータを渡す)
48 # invalidcommand : 入力制限により、入力不正が発生した場合に呼ばれる関数の設定。
49 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/
50 self.entry = tk.Entry(frame, width=15, validate="key", validatecommand=(vcmd, '%S'), invalidcommand=self.invalidText)
51
52 # frame Widget(Frame)を親要素とした場合に、entry Widgetをどのように配置するのか?
53 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
54 self.entry.pack()
55
56# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
57if __name__ == "__main__":
58 # Windowを生成する。
59 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
60 root = tk.Tk()
61 app = Application(master=root)
62 # Windowをループさせて、継続的にWindow表示させる。
63 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
64 app.mainloop()
文字数制限(10文字以内のみ入力可能)
1import tkinter as tk
2
3class Application(tk.Frame):
4 # entry Widget用変数
5 entry = None
6
7 # 入力制限に失敗した場合に呼ばれる関数
8 def invalidText(self):
9 print('入力に失敗しました。')
10
11 # 1. 入力制限の条件を設けて検証する関数の名前を決める
12 # 4. 入力制限の条件を設けて検証する関数を実装する
13 def onValidate(self, P):
14 # 入力された文字が10文字以内の場合
15 # lenについて : https://note.nkmk.me/python-len-usage/
16 if len(P) <= 10:
17 return True
18 else:
19 # 入力不正のブザーを鳴らす。
20 self.bell()
21 return False
22
23 def __init__(self, master=None):
24 # Windowの初期設定を行う。
25 super().__init__(master)
26
27 # Windowの画面サイズを設定する。
28 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/
29 self.master.geometry("300x200")
30
31 # Windowを親要素として、frame Widget(Frame)を作成する。
32 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
33 frame = tk.Frame(self.master)
34
35 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか?
36 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
37 frame.pack()
38
39 # 2. 1で決めた関数名を、register関数を用いて登録する
40 # register : 入力制限を行うための関数の登録を行う。パラメータと関数を紐づけるために必要。
41 vcmd = self.register(self.onValidate)
42
43 # frame Widget(Frame)を親要素として、entry Widgetを作成する。
44 # width : 幅の設定
45 # validate : 入力制限するオプションの値を設定。
46 # validatecommand or vcmd : 入力制限用関数の設定。(3. entryのvalidatecommand option or vcmd optionへ、2の戻り値とパラメータを渡す)
47 # invalidcommand : 入力制限により、入力不正が発生した場合に呼ばれる関数の設定。
48 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/
49 self.entry = tk.Entry(frame, width=15, validate="key", validatecommand=(vcmd, '%P'), invalidcommand=self.invalidText)
50
51 # frame Widget(Frame)を親要素とした場合に、entry Widgetをどのように配置するのか?
52 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
53 self.entry.pack()
54
55# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
56if __name__ == "__main__":
57 # Windowを生成する。
58 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
59 root = tk.Tk()
60 app = Application(master=root)
61 # Windowをループさせて、継続的にWindow表示させる。
62 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/
63 app.mainloop()
まとめ
- entryの入力制限とは、テキストボックスに入力される文字を制限することを意味する。
- ユーザーの利便性を向上させるためにも入力制限は必要。