【Python】Tkinterエントリー作成、文字列の取得する

当サイトで紹介する商品・サービス等の外部リンクは、アフィリエイト広告を含む場合があります。
スポンサーリンク
本記事を読むと以下の実行ができます

PythonでGUIアプリケーションを作成するとき、
ユーザーからの入力を受け取るために使用されるのが「Tkinter」のエントリーボックスです。

エントリーボックスを自由自在にカスタマイズできるようになれば、
ユーザーとのやり取りをよりスムーズに行えるインターフェースが構築できるようになります。

この記事では、Tkinterのエントリーウィジェットを使って、文字列の取得や表示、エントリーボックスのサイズ変更、初期値の設定など、基本的な使い方を解説します。

本記事を読むと以下の実行ができます
  • PythonでGUIアプリケーションを開発したい初心者
  • Tkinterを使ってフォームや入力フィールドを作成したい方
  • エントリーウィジェットの基本的な設定や使い方を学びたい方
  • ユーザーの入力を取得し、リアルタイムで表示する方法を知りたい方
  • 入力フィールドに対する初期値の設定やリセット方法に興味がある方
Udemyで学習する
スポンサーリンク

画面(ウィンドウ)作成

Tkinterを使ったGUIアプリケーションは、最初に画面、
つまりウィンドウを作成するところから始まります。

このウィンドウがユーザーとの対話の場となり、
その上にボタンやエントリーボックスなどのウィジェットを配置していきます。

import tkinter as tk

root = tk.Tk()
root.title("Sample")
root.geometry("300x200")  # サイズを指定
root.mainloop()

ウィンドウサイズの設定やタイトルの指定など、
ユーザーにとって使いやすいデザインを作ることができます。

エントリー(Entry)作成

エントリーウィジェットは、ユーザーが文字を入力するための入力フィールドです。
Tkinterでは、Entryクラスを使って簡単に作成できます。

ここでは、エントリーボックスをウィンドウに配置、サイズや位置を調整する方法を見ていきます。

Pack()

pack()メソッドは、ウィジェットをウィンドウに配置する際に、
シンプルで自動的な位置決定を行う方法です。

entry = tk.Entry(root)
entry.pack(side=tk.TOP, padx=10, pady=10)

ウィジェットを上から順番に詰め込むように配置したい場合に使います。

grid()

grid()メソッドは、ウィジェットを行と列のグリッドに沿って配置する方法です。

entry = tk.Entry(root)
entry.grid(row=0, column=0, padx=10, pady=10)

より柔軟なレイアウトが可能で、複数のウィジェットを整理して配置したい場合に適しています。

Place()

place()メソッドは、ウィジェットをピクセル単位で正確に配置するための方法です。

entry = tk.Entry(root)
entry.place(x=50, y=50)

ウィンドウ上の特定の位置にウィジェットを置く必要がある場合に便利です。

オプション一覧(色・フォントなど)

Tkinterのエントリーボックスは、色、フォント、サイズなどをカスタマイズできます。
例えば、入力フィールドの背景色を変更したり、フォントの種類やサイズを指定することが可能です。

entry = tk.Entry(root, bg="lightblue", font=("Arial", 12), width=30)
entry.pack()

Entryウィジェットから文字列の取得・セット(初期値設定)・クリア

エントリーボックスに入力された文字列を取得するには、get()メソッドを使います。
また、insert()メソッドで初期値を設定したり、delete()メソッドで入力をクリアすることも可能です。

# 文字列の取得
text = entry.get()

# 文字列のセット
entry.insert(0, "アリッシアの朝")

# クリア
entry.delete(0, tk.END)

さらに改良をして、ボタンを押すと、テキストを取得し、エントリーの文字を削除するようにします。

Pythonでボタンを使う方法を紹介しています。
Pythonでラベルを使う方法を紹介しています。
import tkinter as tk

def display_text():
    # エントリーから文字を取得
    text = entry.get()
    # ラベルに表示
    label2.config(text=text)
    # エントリーをクリア
    entry.delete(0, tk.END)

root = tk.Tk()
root.title("Sample")
root.geometry("300x200")  # サイズを指定

# ラベル 
label1 = tk.Label(root, text="名前を入力してください")
label1.pack(pady=10)

# エントリーウィジェット
entry = tk.Entry(root)
entry.insert(0, "アリッシアの朝")
entry.pack(pady=10)

# ボタン
button = tk.Button(root, text="取得", command=display_text)
button.pack(pady=10)

# ラベル (取得した文字を表示するため)
label2 = tk.Label(root, text="")
label2.pack(pady=10)

root.mainloop()

ユーザーにとって使いやすいインターフェースを作ることができます。

入力値をリアルタイムで表示

ユーザーがエントリーボックスに入力した内容をリアルタイムで、
画面に反映させる方法について解説します。

def show_input(*args):
    print(entry.get())

entry_var = tk.StringVar()
entry_var.trace("w", show_input)

entry = tk.Entry(root, textvariable=entry_var)
entry.pack()

traceメソッドを使って、入力が変更されるたびに反応する仕組みを作ることができます。

print()をラベルに変更して、Tkinter上に表示させることも可能です。

Enter(Return)キーで入力値を取得

ユーザーが入力を終えた後、Enterキーを押したタイミングでエントリーボックスから入力値を取得する方法を紹介します。

def on_enter(event):
    print("入力値:", entry.get())

entry.bind("<Return>", on_enter)

bindを使うことでイベントを追加できます。

bindの使い方を紹介しています。

これにより、フォーム送信や次の処理に進む操作を自然な形で実現できます。

Pythonでログインフォームを作成する

Pythonでログインフォームを作るには、TkinterのEntryが有効です。

Pythonでログインフォームをつくる
  • ログイン画面の作成:エントリーウィジェットでユーザー名とパスワードを入力します。
  • 入力値の検証:get()メソッドを使ってエントリーから値を取得し、
    正しいかどうかを確認します。
  • 画面遷移:正しいユーザー名とパスワードが入力されると、
    新しいウィンドウ(画面B)が開き、エントリーボックスで新しいパスワードを設定できます。
  • パスワードの変更:新しいパスワードが正しい形式かどうかを正規表現でチェックし、
    問題がなければ変更が完了します。
Tkinterの画面遷移を紹介しています。

ソースコード

import tkinter as tk
from tkinter import messagebox
import re

# 初期の正しいユーザー名とパスワード
initial_username = "アリッシア"
initial_password = "Alicia-ing"

# グローバル変数を使ってパスワードを更新可能にする
current_password = initial_password

# パスワードのバリデーション関数
def validate_password(password):
    # 大文字、小文字、記号を含むかチェック
    if (re.search(r'[A-Z]', password) and  # 大文字
        re.search(r'[a-z]', password) and  # 小文字
        re.search(r'[\W_]', password)):    # 記号
        return True
    else:
        return False

# 画面Aのログイン処理
def login():
    global current_password
    username = entry_username.get()
    password = entry_password.get()

    if username == "" or password == "":
        message_label.config(text="入力を完了してください", fg="red")
    elif username != initial_username or password != current_password:
        message_label.config(text="パスワードが異なります", fg="red")
        entry_username.delete(0, tk.END)  # 入力フィールドをクリア
        entry_password.delete(0, tk.END)  # 入力フィールドをクリア
    else:
        # 画面Bへ遷移
        open_screen_b(username)

# 画面Bを開く関数
def open_screen_b(username):
    screen_a.withdraw()  # 画面Aを非表示にする
    screen_b = tk.Toplevel()  # 新しいウィンドウ(画面B)
    screen_b.title("画面B")
    screen_b.geometry("300x200")  # 画面サイズの指定

    label_greeting = tk.Label(screen_b, text=f"Hello, {username}", font=("Arial", 14))
    label_greeting.pack(pady=10)

    label_new_password = tk.Label(screen_b, text="新しいパスワード:")
    label_new_password.pack(pady=5)

    new_password_entry = tk.Entry(screen_b)
    new_password_entry.pack(pady=5)

    # エンターキーが押されたらパスワード変更を実行
    new_password_entry.bind("<Return>", lambda event: change_password())

    def change_password():
        new_password = new_password_entry.get()
        if validate_password(new_password):
            global current_password
            current_password = new_password  # パスワードを更新
            messagebox.showinfo("成功", "パスワードが変更されました")
            screen_b.destroy()  # 画面Bを閉じる
            screen_a.deiconify()  # 画面Aを再表示する
        else:
            messagebox.showerror("エラー", "もう一度作成してください (大文字, 小文字, 記号を含む必要があります)")

    change_button = tk.Button(screen_b, text="変更", command=change_password)
    change_button.pack(pady=20)

# メインウィンドウ(画面A)
screen_a = tk.Tk()
screen_a.title("ログイン画面")
screen_a.geometry("300x250")  # 画面サイズの指定

# ユーザー名入力フィールド
label_username = tk.Label(screen_a, text="ユーザー名:")
label_username.pack(pady=5)

entry_username = tk.Entry(screen_a)
entry_username.pack(pady=5)

# パスワード入力フィールド
label_password = tk.Label(screen_a, text="パスワード:")
label_password.pack(pady=5)

entry_password = tk.Entry(screen_a, show="*")  # パスワード非表示
entry_password.pack(pady=5)

# メッセージラベル(エラーメッセージ表示用)
message_label = tk.Label(screen_a, text="")
message_label.pack(pady=5)

# ログインボタン
login_button = tk.Button(screen_a, text="ログイン", command=login)
login_button.pack(pady=20)

screen_a.mainloop()

UdemyでPythonを学習

Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。

ビックセール開催中(12月19日まで)
対象のコースが1500円から(最大95%OFF)

多彩な講座から自分に合った講座を探そう!

最大95%OFF

終了まで

時間




解説

  • モジュール名

「tkinter」:Pythonの標準ライブラリで、GUIアプリケーションを作成するために使用。「tkinter.messagebox」:GUIアプリケーション内で情報やエラーメッセージを表示するダイアログボックスを提供する。
「re」:正規表現を利用した文字列のパターンマッチングを行うために使用。パスワードのバリデーションに活用されている。

  • フィールド(メンバ変数)

「initial_username」:初期の正しいユーザー名を保持する変数。ログイン時にユーザー入力と比較するために使用。
「initial_password」:初期の正しいパスワードを保持する変数。ログイン時にパスワード入力と比較するために使用。
「current_password」:現在のパスワードを保持するグローバル変数。パスワード変更後に更新され、ログイン時に使用される。
「screen_a」:ログイン画面(画面A)のウィンドウオブジェクトを保持。GUIのメインウィンドウを表す。
「screen_b」:パスワード変更画面(画面B)のウィンドウオブジェクト。ログイン成功後に新たに作成される。
「entry_username」:ユーザー名を入力するテキストフィールド。ユーザーがログイン時に使用する。
「entry_password」:パスワードを入力するテキストフィールド。ユーザーがログイン時に使用する。
「message_label」:ログイン時のエラーメッセージや案内メッセージを表示するためのラベル。

  • クラス(関数・メソッド)

「validate_password」関数
正規表現を使用して、入力されたパスワードが大文字、小文字、記号を含むかをチェックし、条件を満たす場合にTrueを返す。それ以外の場合はFalseを返す。

「login」関数
処理の説明を文章にする。
ユーザーが入力したユーザー名とパスワードを検証する。入力が空の場合や不正な組み合わせの場合には、エラーメッセージを表示する。正しいユーザー名とパスワードが入力された場合は、画面Bに遷移する。

「open_screen_b」関数
画面Aを非表示にして、新しいウィンドウ(画面B)を表示し、ユーザーに挨拶メッセージと新しいパスワードを入力させる。パスワード変更のための処理もこの関数内で行われる。

「change_password」関数
ユーザーが入力した新しいパスワードが「validate_password」で有効かを確認し、有効な場合は現在のパスワードを更新し、画面Bを閉じて画面Aを再表示する。無効な場合はエラーメッセージを表示する。

実演

ログイン画面が表示されて、ユーザーが入力した情報に基づいて次の画面に遷移する処理を行います。

エントリーウィジェットにユーザー名とパスワードを入力し、それを検証します。
もし正しいユーザー名とパスワードが入力されると、次の画面が表示され、
パスワードを変更できるようになります。

まとめ

Tkinterを使ってエントリーボックスを作成し、文字列の取得やセット、クリア、そしてリアルタイムでの表示といった操作を行う方法について学びました。
エントリーウィジェットは、ユーザーとのインタラクションを強化するために欠かせない要素です。

Udemyで学習する
タイトルとURLをコピーしました