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