【Tkinter】エントリー(Entry)の使い方

【Tkinter】エントリー(Entry)の使い方

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 入力ウィジェットをスクロールバーにリンクできます
このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。