今日も見に来てくださって、ありがとうございます。石川さんです。
今回は、ログインダイアログを作ってみました。ログインダイアログは別ウィンドウなので、値の引き渡し方法をどうするのか、というのがポイントになります。
出来上がりイメージ
ソースコード
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のときは、キャンセルされています。
まとめ
ログインダイアログを作成することを通して、簡単なダイアログを作成するための基本を学びました。これで、いろいろなダイアログ、作成できそうですね。