PythonでGUIアプリケーションを作成するとき、
ユーザーからの入力を受け取るために使用されるのが「Tkinter」のエントリーボックスです。
エントリーボックスを自由自在にカスタマイズできるようになれば、
ユーザーとのやり取りをよりスムーズに行えるインターフェースが構築できるようになります。
この記事では、Tkinterのエントリーウィジェットを使って、文字列の取得や表示、エントリーボックスのサイズ変更、初期値の設定など、基本的な使い方を解説します。
- PythonでGUIアプリケーションを開発したい初心者
- Tkinterを使ってフォームや入力フィールドを作成したい方
- エントリーウィジェットの基本的な設定や使い方を学びたい方
- ユーザーの入力を取得し、リアルタイムで表示する方法を知りたい方
- 入力フィールドに対する初期値の設定やリセット方法に興味がある方
画面(ウィンドウ)作成
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)
さらに改良をして、ボタンを押すと、テキストを取得し、エントリーの文字を削除するようにします。
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を使うことでイベントを追加できます。
これにより、フォーム送信や次の処理に進む操作を自然な形で実現できます。
Pythonでログインフォームを作成する
Pythonでログインフォームを作るには、TkinterのEntryが有効です。
ソースコード
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()
Pythonの学習進め方
Pythonでできることは多岐に渡ります。
Pythonは強力で柔軟なプログラミング言語ですが、常に情報がアップデートされるので、
新しいライブラリやフレームワークを独学で学び続けることは困難です。
Udemyは動画で目的に応じた講座を受講できるのでレベルを合わせて学習できます。
購入した講座は再生・停止・スキップなどが可能なオンデマンド形式なので、
専門的な内容を自分のペースで独学できます。
Pythonでデータサイエンスや人工知能、GUIを学びたい人はUdemy学習を取り入れましょう。
数多くある講座の中から特におすすめな講座を5つ紹介します。
ビックセール開催中(10月11日まで)
対象のコースが1500円から(最大95%OFF)
Pythonをインストールから環境設定、基本文法が学習できる。さらに、モジュールの使い方やファイル操作の他に暗号化、並列化、インフラ自動化、キューイングシステム、非同期処理についても学べます。
Pythonの基礎を押さえつつ、人口知能やニューラルネットワーク、機械学習を取り扱う。機械学習ライブラリで文字認識や株価分析などを行う。
データサイエンティストになるために必要なツールについて学ぶことができる。統計分析、NumpyやPandasなどを使ったPythonのプログラミング、機械学習の実装、ディープラーニングの実装を学習できる。
PythonでGUIを作成する方法を取り扱う。Tkinterの発展的な操作まで学習できる。翻訳アプリ、家計簿アプリ、電卓アプリ、音楽再生アプリなど作成して、exeファイル化する。
解説
- モジュール名
「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を使ってエントリーボックスを作成し、文字列の取得やセット、クリア、そしてリアルタイムでの表示といった操作を行う方法について学びました。
エントリーウィジェットは、ユーザーとのインタラクションを強化するために欠かせない要素です。