Tkinterで1行テキストボックスを生成するエントリー(Entry)ウィジェットについて解説します。このウィジェットでは1行に収まるテキストの入力をユーザーから受け付とることができます。ユーザー名やメールアドレスなどの入力欄として使えます。
目次
エントリー(Entry)の生成
Entry は Tkinter のウィジェットクラスの1つです。いわゆる1行テキストボックスで、表示窓より長い文字は隠れてしまうものの入力自体は受け付けていて、隠れた部分は左右の矢印キーでカーソルを移動することで表示することができます。
Entry ウィジェットを生成して配置するには他のウィジェット同様次のように記述します。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() self.create_widget() # create_widgetメソッドを定義 def create_widget(self): # label1ウィジェット self.label1 = tk.Label(self.master, text="ユーザー情報を入力してください", padx = 50) self.label1.pack() # entry1ウィジェット self.entry1 = tk.Entry(self.master) # entry1ウィジェットを生成 self.entry1.pack() # entry1ウィジェットを配置 if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
このようにユーザーが入力可能な1行テキストボックスを生成できます。
複数のエントリー(Entry)を並べてみる
実用的なプログラムでは複数のEntryを並べて表示することもあります。左側に項目名、右側に入力エリアというUIを見慣れている方も少なくないのではないでしょうか。
ループ処理を使えば複数のLabelとEntryを効率的に生成・配置することができます。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() self.create_widget1() # create_widget1メソッドを定義 def create_widget1(self): # label1ウィジェット self.label1 = tk.Label(self.master, text="ユーザー情報を入力してください", padx = 50) self.label1.pack(padx=5, pady=5) # 各項目のlabelとentry items = ["氏名", "生年月日", "電話番号", "メールアドレス"] # itemsリストを定義 for item in items: # ループ開始 row = tk.Frame(self.master) # 各項目のlabelとentryを囲むrowフレームを生成 label = tk.Label(row,text=item) # 各項目のlabelを生成 entry = tk.Entry(row) # 各項目のentryを生成 row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5) # rowフレームを配置 label.pack(side=tk.LEFT) # labelウィジェットを配置 entry.pack(side=tk.RIGHT, fill=tk.X) # entryウィジェットを配置 if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
23行目で項目名のリストを作っておき、24行目から31行目ではリストを利用した Label と Entry 、そしてそれらをまとめるためのFrameを項目ごとに生成しています。
エントリー(Entry)を利用した処理
Entry に入力された値を取得するにはgetメソッドを使います。
例として「確認」ボタンを押すと Entry に入力された値をコンソールに表示するプログラムを作成してみましょう。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") # 実行内容 self.pack() self.create_widget1() # create_widget1メソッドを定義 def create_widget1(self): # label1ウィジェット self.label1 = tk.Label(self.master, text="ユーザー情報を入力してください", padx = 50) self.label1.pack(padx=5, pady=5) items = ["氏名", "生年月日", "電話番号", "メールアドレス"] # button1が押された時に実行されるfetchメソッドを定義 def fetch(entries): # entriesリストの要素は(項目名, entryウィジェット)のタプルとなっている for entry in entries: # ループ開始 item = entry[0] # 項目名を取得 text = entry[1].get() # entryウィジェットの入力値を取得 print('{}: "{}"'.format(item, text)) # 値をフォーマットして出力 # 各項目のlabelとentry def makeform(self, items): # 処理を呼び出せるようmakeform関数としてまとめる entries = [] # entriesリストを定義 for item in items: row = tk.Frame(self) label = tk.Label(row,text=item) entry = tk.Entry(row) row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5) label.pack(side=tk.LEFT) entry.pack(side=tk.RIGHT, fill=tk.X) entries.append((item, entry)) # 項目名と生成したentryウィジェットのタプルを1つの要素としてentriesリストに追加 return entries # entriesリストを返り値として返す ents = makeform(self, items) # ents変数を定義してmakeform関数を代入 self.button1 = tk.Button(self.master, text="確認",command=(lambda e=ents: fetch(e))) # ボタンが押されるとmakeform関数を実行してその返り値を使ってfetch関数を実行 self.button2 = tk.Button(self.master, text="終了", command=root.quit) self.button1.pack(side=tk.LEFT, padx=5, pady=5) self.button2.pack(side=tk.LEFT, padx=5, pady=5) if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
各項目の Label と Entry を生成する32行目から43行目の処理をまとめて呼び出せるよう makeform 関数として定義し、生成した Lable のテキストと Entry ウィジェットを1組のタプルとした entries リストとし、処理の終わりに返すよう記述します。
24行目から29行目の fetch 関数はこの entries リストを使って項目名と Entry に入力された値をフォーマットしてコンソールに出力します。
46行目から49行目で button を2つ生成・配置し、「確認」ボタンは押すと makeform 関数と fetch 関数を実行するよう記述、「終了」ボタンは押すとアプリケーションを終了するよう記述しています。
エントリー(Entry)で使えるオプション引数
属性 | 説明 | 値 |
---|---|---|
command | Entry ウィジェットそのものの状態が変更されるたびに呼び出される関数のポインタを指定します | 関数名 |
exportselection | Entryウィジェット内でテキストを選択したときにクリップボードにエクスポートするかどうか | 1(エクスポートされる) 0(エクスポートされない) |
state | エントリーの状態を指定 | tk.NORMAL(通常) tk.DISABLED(応答しない) |
textvariable | Entryウィジェットのテキストを変数で指定します | ウィジェット変数 |
xscrollcommand | 入力ウィジェットをスクロールバーにリンクできます |