【Python】PythonでのGUI作成3

2025 年 1 月 8 日 by yamamotor

1.はじめに

前回に引き続き、TKinterを利用してPythonで画面を作成していきます。

2.メイン画面に入力フォームを作成する

前回作成したソースを以下に記載します。

import tkinter

def on_button_click():
    new_window = tkinter.Toplevel(app)
    new_window.title('New Window')
    new_window.geometry('200x100')
    
    label = tkinter.Label(new_window, text='クリックされました')
    label.place(x = 10, y = 10)

# Tkクラス生成
app = tkinter.Tk()
# 画面サイズ
# app.geometry('600x400')
# 画面状態
app.state('zoomed')
# 画面タイトル
app.title('サンプル画面')

# ボタンを作成
buttton = tkinter.Button(text='Click', command=on_button_click)
# ボタンを配置
buttton.place(x = 10, y = 10)

# 画面をそのまま表示
app.mainloop()

今回はExcelでデザインした以下の入力フォームを作成します。

また、氏名とメールアドレスの両方、またはいずれかが入力されていない場合には登録ボタンを押した際にそれを伝える文言を表示するようなサブウィンドウを表示します。

氏名とメールアドレスの両方が入力されている場合は登録完了を伝える文言を表示するサブウィンドウを表示します。

上記を実装したソースを以下に記載します。

import tkinter

def on_button_click():
    new_window = tkinter.Toplevel(app)
    new_window.title('New Window')
    new_window.geometry('200x100')
    
    # エントリーの入力値を取得
    name_input = name_entry.get()
    mail_input = mail_entry.get()
    
    # 結果表示ラベルを作成
    result_label = tkinter.Label(new_window)
    
    # エントリーの入力値を判別
    if(name_input == "" and mail_input == ""):
        {
            result_label.config(text='氏名・メールアドレスが未入力です')
        }
    elif(name_input == ""):
        {
            result_label.config(text='氏名が未入力です')
        }
    elif(mail_input == ""):
        {
            result_label.config(text='メールアドレスが未入力です')
        }
    else:
        {
            result_label.config(text='登録完了!')
        }
    
    # 結果表示ラベルを配置
    result_label.place(x=10, y=10)

# Tkクラス生成
app = tkinter.Tk()
# 画面サイズ
app.geometry('600x400')
# 画面タイトル
app.title('登録フォーム')

# 氏名ラベルを作成
name_label = tkinter.Label(app, text='氏名')
# 氏名ラベルを配置
name_label.place(x=40, y=20)

# メールアドレスラベルを作成
mail_label = tkinter.Label(app, text='メールアドレス')
# メールアドレスラベルを配置
mail_label.place(x=20, y=50)

# 氏名エントリーを作成
name_entry = tkinter.Entry(app)
# 氏名エントリーを配置
name_entry.place(x=100, y=20)

# メールアドレスエントリーを作成
mail_entry = tkinter.Entry(app)
# メールアドレスエントリーを配置
mail_entry.place(x=100, y=50)

# ボタンを作成
buttton = tkinter.Button(text='登録', command=on_button_click, width=5)
# ボタンを配置
buttton.place(x=90, y=80)

# 画面をそのまま表示
app.mainloop()

上記を実行すると以下のようなウィンドウが表示されます。

また、以下の複数の条件で入力を行います。

上記条件で入力を行い、登録ボタンを押した結果を以下に記載します。

パターン1

パターン2

パターン3

パターン4

コードについて新しく使用した機能について解説します。

# 氏名ラベルを作成
name_label = tkinter.Label(app, text='氏名')
# 氏名ラベルを配置
name_label.place(x=40, y=20)

# メールアドレスラベルを作成
mail_label = tkinter.Label(app, text='メールアドレス')
# メールアドレスラベルを配置
mail_label.place(x=20, y=50)

# 氏名エントリーを作成
name_entry = tkinter.Entry(app)
# 氏名エントリーを配置
name_entry.place(x=100, y=20)

# メールアドレスエントリーを作成
mail_entry = tkinter.Entry(app)
# メールアドレスエントリーを配置
mail_entry.place(x=100, y=50)

氏名とメールアドレスのラベルと入力欄を作成しています。

TKinterの入力欄にはテキストボックスとエントリーの2種類がありますが、今回はエントリーを利用しています。

2つの違いはエントリーは入力が1行のみ、テキストボックスは複数行の入力が可能となっているため、今回の登録フォームではエントリーが適しています。

エントリーを作成するにはEntry関数を利用します。

引数には配置するウィンドウを指定してください。

また、ラベル等と同様に、pack関数かplace関数で配置する必要があるので注意してください。

今回はplace関数の引数を変更し、レイアウトの調整を行っています。


def on_button_click():
    new_window = tkinter.Toplevel(app)
    new_window.title('New Window')
    new_window.geometry('200x100')
    
    # エントリーの入力値を取得
    name_input = name_entry.get()
    mail_input = mail_entry.get()
    
    # 結果表示ラベルを作成
    result_label = tkinter.Label(new_window)
    
    # エントリーの入力値を判別
    if(name_input == "" and mail_input == ""):
        {
            result_label.config(text='氏名・メールアドレスが未入力です')
        }
    elif(name_input == ""):
        {
            result_label.config(text='氏名が未入力です')
        }
    elif(mail_input == ""):
        {
            result_label.config(text='メールアドレスが未入力です')
        }
    else:
        {
            result_label.config(text='登録完了!')
        }
    
    # 結果表示ラベルを配置
    result_label.place(x=10, y=10)

ボタンを押した際に作成したエントリーの入力値を取得する記載をしています。

エントリーの入力値を取得するにはget関数を利用します。

また、取得した入力値に応じてラベルに記載する文字列を変更しています。

すでに作成したラベルの文字を変更するにはconfig関数を利用します。

引数には新規で作成するときと同じ記載をしてください。

最後に文字列を変更したラベルを配置して、結果を表示します。

3.終わりに

今回は画面に入力欄を配置し、入力値の処理を行いました。

次回はファイルの取り込みを行えるようにしてみます。

タグ: ,

TrackBack