今日も見に来てくださって、ありがとうございます。石川さんです。
今回は、ログインダイアログを作ってみました。ログインダイアログは別ウィンドウなので、値の引き渡し方法をどうするのか、というのがポイントになります。
出来上がりイメージ

ソースコード
import tkinter as tk
from tkinter.simpledialog import Dialog
class LoginDialog(Dialog):
def __init__(self, root):
super().__init__(root, title="Login")
def body(self, master):
self.username = tk.StringVar()
self.password = tk.StringVar()
userLabel = tk.Label(master, text="User:")
userLabel.grid(row=0, column=0)
username = tk.Entry(master, textvariable=self.username)
username.grid(row=0, column=1)
passwdLabel = tk.Label(master, text="Pass:")
passwdLabel.grid(row=1, column=0)
password = tk.Entry(master, show="*", textvariable=self.password)
password.grid(row=1, column=1)
self.information = tk.Label(master)
self.information.grid(row=2,columnspan=2)
def validate(self):
self.information.configure(text="")
if not self.username.get():
self.information.configure(text="Input username")
return False
if not self.password.get():
self.information.configure(text="Input password")
return False
return True
def apply(self):
self.result = self.username.get(), self.password.get()
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("Login dialogue")
self.geometry("400x100")
show = tk.Button(self, text="login", command=self.show)
close = tk.Button(self, text="close", command=self.destroy)
show.grid(row=0, column=0, sticky=tk.EW, ipadx=20, padx=40, pady=20)
close.grid(row=0, column=1, sticky=tk.EW, ipadx=20, padx=40, pady=20)
def show(self):
ret = LoginDialog(self)
print(ret.result)
if __name__ == "__main__":
application = Application()
application.mainloop()
説明
ログインダイアログは、tkinter.simpledialogのDialogを継承して作成しました。4~33行目です。ログインダイアログの中身は、body()メソッドをオーバーライドして実装します。ユーザー名とパスワードとメッセージ出力用のラベルを追加しました。もし、OKとCancel以外のボタンを使いたいときは、buttonbox()メソッドをオーバーライドしますが、今回はこれで充分でしょう。
OKボタンを押したときに、値をチェックするには、validate()メソッドをオーバーライドします。今回は、22~30行目に記載があります。ユーザー名かパスワードが入力されていないとき、Falseを戻します。成功時はTrueを戻すようにしました。30行目のTrueを戻すことを忘れると、PythonはデフォルトでNoneを戻す約束ですので、OK押してもその後続処理のapply()は実行されませんので、注意が必要です。
OKボタンを押したときの処理は、apply()メソッドをオーバーライドします。今回は、33行目で、ダイアログボックスに入力した値をself.resultへセットしています。self.resultは、初期化時にNoneをセットされていますので、Cancel押されたかどうか、この値を判定すればわかりますね。
呼び出し方法は、47行目のようにします。戻り値の判定は48行目のret.resultをチェックすれば完璧です。Noneのときは、キャンセルされています。
まとめ
ログインダイアログを作成することを通して、簡単なダイアログを作成するための基本を学びました。これで、いろいろなダイアログ、作成できそうですね。

