今日も見に来てくださって、ありがとうございます。石川さんです。
Tkinterで業務アプリケーション作るときに絶対避けて通れない、Entryについてちょっとまとめたいと思います。Entryは一行だけデータを入力できるフィールドを作るためのウィジェットです。データが入力できるだけだよねぇ、と、思っていたのですが、意外と便利な機能が用意されているようです。
実行イメージ
普通にEntryを何の飾りもなく使うとこんな感じになります。

ソースコード
もっともシンプルなEntryの使い方は、以下の通りです。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Entry Test")
self.entry = tk.Entry()
self.entry.pack()
if __name__ == "__main__":
app = App()
app.mainloop()
使い方
普通にテキストを入力することができます。

入力されたテキストを取得するには、self.entry.get()のように、getメソッドで入力されたテキストを取得することができます。
入力時のチェックは、validate、validatecommandで実装可能です。例えば入力文字数を6文字に限定するにはスクリプトを以下のように書き換えます。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Entry Test")
vc = (self.register(self.validate_command), "%P")
self.entry = tk.Entry(validate="key", validatecommand=vc)
self.entry.pack()
def validate_command(self, string):
return len(string) <= 6
if __name__ == "__main__":
app = App()
app.mainloop()
7行目でコマンドを登録して8行目のEntry定義時にvalidateとvalidatecommandをセットしています。validateには、ここにあるように、”key”以外にも、”none”、”focusin”、”focusout”、”focus”、”all”が指定できるようです。ちなみに”focus”は、”focusin”と”focusout”の両方で、”all”は、”key”と”focusin”、”focusout”と同じだそうです。指定することで、いずれかのトリガーでコマンドが実行される、ということになります。
”%P”を指定しているところは、以下の指定が可能でそれぞれの意味を記載しておきます。
| コード | 渡される値 |
| %d | 1は挿入、0は削除、その他のイベントは-1 |
| %i | 挿入または削除される文字列のインデックス |
| %P | 変更後に想定されるフィールドの値 |
| %s | 編集前のエントリの現在値 |
| %S | 挿入または削除されるテキスト文字列 |
| %v | 現在設定されている検証のタイプ(focusin、focusout、key、forced) |
| %V | コールバックした検証のタイプ(focusin、focusout、key、forced) |
| %W | ウィジェットの名前(entry!) |
まとめ
今回紹介した、validateとvalidatecommandを利用することで簡単な入力制限を実現できそうですね。

