【Python/tkinter】Entry(テキストボックス)

tkinterでテキストボックスはEntryと言います。

以下に簡単なサンプルを示します。

 

(実行結果)

(サンプルプログラム)

import tkinter as tk

class Application(tk.Frame):

    def __init__(self, master = None):
        super().__init__(master)

        self.master.title("Entryの作成")    # ウィンドウタイトル
        self.master.geometry("300x100")     # ウィンドウサイズ(幅x高さ)

        # 表示する値
        self.entry_text = tk.StringVar() 
        # Entry(テクストボックス)の作成
        entry = tk.Entry(self.master,
            width = 30,         # ウィジェットの幅(文字数で指定)
            justify = tk.RIGHT, # tk.RIGHT:右寄せ、tk.LEFT:左寄せ、tk.CENTER:中央寄せ
            textvariable = self.entry_text # 表示する値
            )
        # ボタンの作成
        btn_input = tk.Button(self.master, text = "入力", command = self.btn_input_click)
        btn_clear = tk.Button(self.master, text = "クリア", command = self.btn_clear_click)

        entry.pack()
        btn_input.pack()
        btn_clear.pack()

    def btn_input_click(self):
        ''' Entryに入力された値を表示 '''
        print("Text = ", self.entry_text.get())

    def btn_clear_click(self):
        ''' Entryのクリア '''
        self.entry_text.set("")

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

ポイント

  • Entryの値はtextvariableにStringVarクラスオブジェクトを指定し、Entryのテキストの取得はStringVarクラスオブジェクト.get()、設定はStringVarクラスオブジェクト.set()で行います。
  • 他のウィジェットには標準的にはるcommandオプションがEntryにはありません。
    その代わりにvalidatecommandでテキストが変更されたときの処理を行います。
    詳細は後半で説明します。

オプション

オプション名 説明
background 通常時(クリックされていないとき)の背景色を指定します。(bgと同じ)
bd 枠線の太さを指定します。
bg backgroundと同じ
borderwidth bdと同じ
cursor ウィジェット上にマウスポインタがある際のカーソルの種類を指定します。
(参考)https://tkdocs.com/shipman/cursors.html
disabledbackground stateオプションで無効(DISABLED)に設定している際の背景色を設定します。
disabledforeground stateオプションで無効(DISABLED)に設定している際の文字色を設定します。
exportselection
fg 表示する文字色を指定します。(foregroundと同じ)
font 表示する文字のフォントを指定します。
foreground fgと同じ
highlightbackground
highlightcolor
highlightthickness
insertbackground
insertborderwidth
insertofftime
insertontime
insertwidth テキスト挿入時のカーソルの太さを指定します。
invalidcommand
invcmd
justify 文字寄せ方向を指定します。
【設定値】左寄せ(tk.LEFT), 中央寄せ(tk.CENTER), 右寄せ(tk.RIGHT)
relief テキストボックスの枠線のスタイルを指定します。
【設定値】tk.RAISED, tk.GROOVE, tk.SUNKEN, tk.RIDGE, tk.FLAT
【初期値】tk.FLAT(枠線なし)
selectbackground
selectborderwidth
selectforeground
show テキストボックスに表示する文字列を指定します。
(使用例)パスワード入力のとき
show = “*”
state ウィジェットの有効/無効(操作できない状態)を指定します。
【設定値】tk.NORMAL, tk.DISABLED
【初期値】tk.NORMAL
takefocus
textvariable Entryの値を取得、設定するためのStringVarクラスのインスタンスを指定します。
他にもIntVar, DoubleVar, BooleanVarの指定が可能です。
これらを指定することで、入力する値の型制限が可能になります。
validate 検証の対象を指定します。
‘none’, ‘key’, ‘focus’, ‘focusin’, ‘focusout’, ‘all’ のいづれか
validatecommand 検証の登録を行います。
width テキストボックスの幅を文字数で指定します。
xscrollcommand

メソッド

オプション名 説明
delete(first, last=None) 最初と最後の文字の位置を指定してテキストを削除します。
(例)最初から最後までを削除する方法
entry.delete(0, tk.END)
get() テキストボックスの文字列を取得します。
icursor(index) 挿入するカーソルの位置を指定します。
index(index)
insert(index, s) 指定した位置に文字を挿入します。
select_adjust ( index ) カーソルの位置から指定した位置までを選択します。
select_clear() テキストの選択状態を解除します。
select_from ( index )
select_present() 文字が選択されている場合はTrue, 選択されていない場合はFalseを返します。
select_range ( start, end ) 開始位置、終了位置を指定して文字を選択します。
select_to ( index ) 指定位置からカーソルの位置までを選択します。
xview ( index ) 横方向のスクロール位置を指定します。
xview_scroll ( number, what )

 

入力検証

テキストボックスに文字を入力してから表示するまでの間に、実際に表示するかどうか?を制御することが可能です。例えば、文字数の制限や、数字のみの入力などの制限をかけることができます。

 

(サンプルプログラム)テキストボックスの入力文字数を5文字までに制限する例

import tkinter as tk

class Application(tk.Frame):

    def __init__(self, master = None):
        super().__init__(master)

        self.master.title("Entryの作成")     # ウィンドウタイトル
        self.master.geometry("300x100")       # ウィンドウサイズ(幅x高さ)

        validate_command = self.master.register(self.enty_validate)
        
        entry = tk.Entry(self.master,
            width = 30,
            validate='all', # 検証をどのタイミングで行うか?を指定します
            validatecommand = (
                validate_command, 
                '%d',   # アクションの種類 1:挿入、0:削除、-1:再検証
                '%i',   # 挿入/削除される文字の位置 挿入/削除されない場合は-1
                '%P',   # テキスト編集後の文字列
                '%s',   # テキスト編集前の文字列
                '%S',   # 挿入/削除される文字列
                '%v',   # validateオプションで指定した種類
                '%V',   # 実際に実施されたvalidateの種類
                '%W'    # Entryウィジェットの名前
                )
        )
        entry.pack()

    def enty_validate(self, action, index, prevalidation, current, test, validata_option, condition, name):
        '''入力検証'''
        print("enty_validate", action, index, prevalidation, current, test, validata_option, condition, name)

        if len(prevalidation) > 5:
            # 入力文字数を5文字までに制限
            # Falseを返すとテキストボックスに入力した文字は反映されない
            return False
        else:
            # Trueを返すとテキストボックスに入力した文字が反映される
            return True

if __name__ == "__main__":
    root = tk.Tk()
    app = Application(master = root)
    app.mainloop()

上記サンプルは、すべてのタイミング(validateオプション)で、すべての情報を取得していますが、’%P’や’%S’だけを使用しても構いません。ただし、オプションの数に合わせて、呼ばれるメソッド(上記サンプルでは entry_validate)の引数の数を調整する必要があります。

validateオプション

オプション名 説明
none 検証なし(初期値)
key キー入力時
focus フォーカス時?
focusin フォーカスを取得したとき
focusout フォーカスを失ったとき
all 全て

validatecommandオプション

オプション名 説明
‘%d’ アクションの種類 1:挿入、0:削除、-1:再検証
‘%i’ 挿入/削除される文字の位置 挿入/削除されない場合は-1
‘%P’ テキスト編集後の文字列
‘%s’ テキスト編集前の文字列
‘%S’ 挿入/削除される文字列
‘%v’ validateオプションで指定した種類
‘%V’ 実際に実施されたvalidateの種類
‘%W’ Entryウィジェットの名前

 

参考

https://tcl.tk/man/tcl8.6/TkCmd/ttk_entry.htm

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください