【Python tkinter】テキストボックスEntryに文字数制限(入力制限)を設定する

時計 2021.05.11 / 時計

【Python tkinter】テキストボックスEntryに文字数制限(入力制限)を設定する

本記事ではPythonのTkinterにおける、Entryウィジェットのテキストボックスに、文字数制限(入力制限)を設定する方法について解説していきます。

GUIアプリケーションを作成していると、ある文字数未満または以上でテキストボックスに文字列を入力してほしい場面があります。

例えば、8文字以上でパスワードを入力してほしい場面などです。

本記事を通して、Entryウィジェットで文字数制限を実現する方法を学んでください。

Tkinterの基本的な使い方がわからない方は、以下記事をご参照ください。

TkinterのEntryウィジェットの基本的な使い方やオプションについては、以下記事をご参照ください。

文字数制限(入力制限)について

文字数制限とは、テキストボックス内で特定の文字数以上の入力または特定の文字数未満の入力を必須とするということです。

デフォルトでは文字数制限がないため、一行のテキストボックスに何文字でも入力することが可能です。

ユーザーの入力ミスを少なくするため、またデータベースの登録で制限を設けたい場合など、様々な用途で文字数制限は使用できます。

サンプルプログラム:文字の入力制限

テキストボックスの文字の入力制限について詳しく解説する前に、サンプルプログラムを先に確認していただきます。

tkinter:テキストボックスで文字数制限
import tkinter as tk

def limit_char(string):
    return len(string) <= 5

root = tk.Tk()
root.title("Entry widget")
root.geometry("300x100")

frame = tk.Frame(root, pady=20, padx=5)

vc = root.register(limit_char)
entry = tk.Entry(frame, validate="key", validatecommand=(vc, "%P"))

frame.pack()
entry.pack()

root.mainloop()

このプログラムは、テキストボックス内に5文字までしか入力できないように文字制限がされています。

それではこのプログラムで行っている文字制限について次項より解説していきます。

テキストボックスに文字制限(入力制限)を設定

Entryウィジェットのオプション:validatecommand、validate

Entryウィジェットのテキストボックスに文字制限(入力制限)を実装するために、
validatecommandオプションとvalidateオプションの二つを使用します。

vc = root.register(limit_char)
entry = tk.Entry(frame, validate="key", validatecommand=(vc, "%P"))

validate

validateオプションでは、テキストボックスに入力されたテキストを検証するタイミング(トリガー)を指定します。

以下に指定できる値の一覧を記します。

説明
none デフォルト:検証しない
focusin フォーカスが入ったタイミング
focusout フォーカスが外れたタイミング
focus focusinとfocusoutの両方のタイミング
key テキストボックス内の文字列が変化したタイミング
all 上記すべてのタイミング

例えば、テキストが入力されるたびに検証したいなら、keyを指定します。

このテキスト検証時に、入力された文字数やテキストの種類を確認します。
指定した検証タイミングがきたら、次に説明するvalidatecommandで指定されたコールバック関数が実行されます。

validatecommand

validatecommandオプションでは、コールバック関数とパラメーターを指定します。

validatecommand=(コールバック関数, パラメーター)

指定したパラメーターによって、コールバック関数に渡す値(テキスト)が異なります。
どの値を渡したいかによって、パラメーターを変えます。

パラメーター 説明
%P テキストボックスの入力されている文字(文字の挿入後)
%s 文字が入力される前の入力文字
%S 挿入または削除される文字
%W ウィジェット名
%d 数値を返す:1(挿入)、0(削除)、その他(-1)
%i 挿入または削除される文字のインデックス値
%v 設定されている検証タイプ
%V コールバックの検証タイプ

validatecommandオプションで指定するコールバック関数は、サンプルプログラムではregister()メソッドを使って次のように定義されます。

vc = root.register(limit_char)

サンプルプログラムでは、テキストボックスにテキストが入力される度に(validate=”key”)、入力値(%P)がlimit_char関数に渡されて実行されます。

limit_char関数内では、文字数が5文字以上になるとFalseとなります。

return len(string) <= 5

つまりテキストボックスに6文字目が入力できないということです。

サンプルプログラム:最小文字数を設定

ここまで学んだことを活かして、ユーザーアカウント登録をする画面を作成してみたいと思います。

サンプルプログラムは以下の機能を備えています。

  • User Nameには最大8文字の文字を入力可能
  • Passwordに8文字以上の文字入力がある場合、Registerボタンが押せる

Passwordに8文字以上の文字入力がないと、ボタンは非アクティブ状態になります。

tkinter:テキストボックスに文字数制限を設けたサンプルプログラム

Passwordに8文字以上の文字入力があると、ボタンがアクティブ状態になり、押せるようになります。

tkinter:テキストボックスに文字数制限を設けたサンプルプログラム(ボタンアクティブ)

以下にこのプログラムのソースコードを記します。

import tkinter as tk

def limit_char(string):
    return len(string) <= 8

def at_least_char(string):
    if len(string) < 8:
        button['state'] = 'disabled'
    else:
        button['state'] = 'normal'
    return True

root = tk.Tk()
root.title("Entry widget")
root.geometry("300x100")

frame = tk.Frame(root, pady=20, padx=5)

vc1 = root.register(limit_char)
vc2 = root.register(at_least_char)

label1 = tk.Label(frame, text="User Name : ")
entry1 = tk.Entry(frame, validate="key", validatecommand=(vc1, "%P"))

label2 = tk.Label(frame, text="Password : ")
entry2 = tk.Entry(frame, validate="key", validatecommand=(vc2, "%P"), show="*")

button = tk.Button(frame, text="Register", state='disabled')

frame.pack()
label1.grid(row=0, column=0)
entry1.grid(row=0, column=1)

label2.grid(row=1, column=0)
entry2.grid(row=1, column=1)

button.grid(row=2, column=0, columnspan=2, pady=5)

root.mainloop()

まとめ

本記事「【Python tkinter】テキストボックスEntryに文字数制限(入力制限)を設定する」はいかがでしたか。

詳しくEntryウィジェットに文字数制限を設定する方法を解説しているサイトがなかったので、本サイトに載せてみました。

本記事で紹介した「文字数入力制限」は、様々なアプリで利用できる、役立つ知識だと思います。

他にもTkinterでGUIアプリを作成する上で必要になる情報をアップしていますので、ぜひ確認してみてください。