Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-

2021年7月19日月曜日

Python tkinter

t f B! P L

今回やること

今回はめったにやらないTkinterの記事です。
なかなか他のサイトでは詳しく教えられていないようなので、
今回の記事で超詳しくメッセージボックスについて100%説明します。(自分でハードル上げていく)

基本型

ここらへんは他のサイトでものっていることです。
import tkinter
import tkinter.messagebox as messagebox
messagebox.showinfo ("タイトルです。","メッセージです。") #情報アイコンを表示
messagebox.showwarning ("タイトルです。","メッセージです。") #警告アイコンを表示
messagebox.showerror ("タイトルです。","メッセージです。") #エラーアイコンを表示
Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-
ここはあまり詳しい説明はいらなそうですね。OKボタンのみを表示させたい場合は、大きく分けてこの3つになります。
ですが。
OKボタンだけだけど、質問アイコンを表示さえたい。ってとき。tkinterのメッセージボックスはカスタマイズできるので、それについては後で紹介します。

選択肢を増やす

[はい][いいえ]や[OK][キャンセル]などのボタンを増やします。
これも他のサイトでよく紹介されますが、一応触れておきましょう。
import tkinter.messagebox as messagebox
messagebox.askyesno("タイトル","質問メッセージです。")
messagebox.askokcancel("タイトル","OK Cancel質問です。")
messagebox.askyesnocancel("タイトル","はいいいえキャンセル質問です。")
messagebox.askretrycancel("タイトル","再試行キャンセル質問です。")
Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-

ここで思ったのが、再試行キャンセルの場合って、勝手にアイコンが警告アイコンになるんですよね。
これにどう対処するか。その方法もこの記事にかかれているのでみてください。


んで、戻り値についてですが、今まであげた関数については基本的にTrue False Noneという感じになります。
[はい]や[OK]がTrueになりますし、[いいえ]がFalseになります。
[キャンセル]はボタン2つの場合はFalseになりますし、ボタン3つの場合はNoneというふうになります。
サンプルコードはこんな感じにできます。
import tkinter.messagebox as messagebox
user = messagebox.askokcancel("確認","のこり30秒でシャットダウンしますよ。(嘘です)")
if user == True: #[OK]がクリックされたら... (if user: でも可)
    messagebox.showwarning("お知らせ","OKがクリックされました。\n30秒後にシャットダウンします(大嘘)")
elif user == False: #[キャンセル]がクリックされたら... (else: でも可)
    messagebox.showinfo("お知らせ","キャンセルがクリックされました。\nシャットダウンをキャンセルします。")
Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-
また、さらに、そして、
ボタン3つの場合のサンプルコードはこんな感じです。
import tkinter.messagebox as messagebox
user = messagebox.askyesnocancel("Microsoft Excel (大嘘)","変更した内容を保存しますか")
if user == True: #[はい]がクリックされたら... (if user: でも可)
    messagebox.showinfo("Microsoft Excel (大嘘)","保存しました (うそ)")
elif user == False: #[いいえ]がクリックされたら...
    messagebox.showwarning("Microsoft Excel (大嘘)","保存しませんでした。")
elif user == None: #[キャンセル]がクリックされたら... (else: でも可)
    messagebox.showinfo("Microsoft Word (大嘘、Wordに変わってる)","キャンセルしました。")
Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-

はい。他のサイトでも紹介されそうなところはここで終了。こおからが本番ですよ。

カスタマイズする - アイコン

まずは、[OK]ボタンしかないのに質問アイコンをださせる という方法です。
こんな感じのコードになります。
import tkinter.messagebox as messagebox
messagebox.showinfo("タイトル","カスタマイズされたメッセージボックス",icon="question")

Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-
なんか質問してないのに質問アイコン出るの違和感ありますが、こんな感じで、iconを引数に指定すると、すきなアイコンにすることができます。これは[OK]ボタンしかないメッセージボックスに限ったことではありません。
[再試行][キャンセル]のボタンにしてしまうと、勝手に警告アイコンになりますが、このやり方を使えばそのモヤモなが解消されます。

Excelなどを再現してみると、こんな感じにカスタマイズできます。
import tkinter.messagebox as messagebox
user = messagebox.askyesnocancel("Excel (大嘘)","ブックの内容を保存しますか",icon="warning")
print(user) #アイコンのみを変更しても戻り値は変わらない

Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-
アイコンの指定も覚えやすく、警告アイコンなら"warning"になりますし、情報アイコンなら"information"で、エラーアイコンなら"error"、質問アイコンなら"question"となります。

カスタマイズ - ボタン

アイコンだけではなく、ボタンも変更できます。
ボタンを変更するには、messagebox.askquestionのtype=オプションを指定します。
import tkinter.messagebox as messagebox
user = messagebox.askquestion("タイトル","メッセージ内容です。",type="retrycancel",icon="error")
if user == "retry":
    messagebox.showinfo("再試行","再試行")
else:
    messagebox.showinfo("キャンセル","キャンセル")
さらに、askquestionだと、戻り値が異なります。

 

yes[はい]
no[いいえ]
cancel[キャンセル]
ok[OK]
retry[再試行]
ignore[無視]
abort[中止]
そして、typeでボタンを変更できるのですが、指定できるのはこれです↓

 

yesno[はい] [いいえ]
yesnocancel[はい] [いいえ] [キャンセル]
okcancel[OK] [キャンセル]
retrycancel[再試行] [キャンセル]
abortretrycancel[中止] [再試行] [無視]
そして、このようにカスタマイズできるのです。
import tkinter.messagebox as messagebox
user = messagebox.askquestion("Error","エラーが何故か発生しました",type="abortretryignore",icon="error")
if user == "abort":
    messagebox.showinfo("情報","中止がクリックされました。")
elif user == "retry":
    messagebox.showinfo("情報","再試行がクリックされました。")
elif user == "ignore":
    messagebox.showinfo("情報","無視がクリックされました。")

Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-
いいですね。
こんな感じでaskquestionと組み合わせると、自分好みのメッセージボックスをつくることができます。

カスタマイズ - デフォルトボタン

これはどういうことかというと、例えば、はいといいえのボタンがあったとして、それで、「はい」の方にフォーカスが入った状態にします。これは、「はい」がデフォルトのボタンということになり、この状態でエンターキーを押すとはいが反応します。
反対に「いいえ」の方をデフォルトボタンにすると、おの状態でエンターキーを押すと「いいえ」が反応します。
あまり必要のない気がするけど、やってみましょう。 デフォルトボタンを指定するのは簡単で、default= と指定すればいいでけです。超簡単です。
import tkinter.messagebox as messagebox
messagebox.askquestion("タイトル","メッセージ内容です。",type="yesnocancel",icon="warning", default="no")
Tkinterでメッセージボックスを表示させる -メッセージボックスをフルに使う-

はい。こんな感じで「いいえ」に青い囲みがあり、この状態でEnterキーやスペースキーを押すと「いいえ」が反応します。
defaultに入るのは文字列で以下のようなものが指定できます。

 

yes[はい]
no[いいえ]
cancel[キャンセル]
ok[OK]
retry[再試行]
ignore[無視]
abort[中止]
デフォルトボタンまで理解したら、もう怖いものはありません。最後にメッセージボックスのコードを自動で生成してくれるすごいものをつくりたいのですが、
めんどくさくなったのでまた今度ここに追記しておきたいと思います。
質問、要望、疑問、コメント、感想、気軽にどうぞ!!

このブログを検索

要望について

ブログのレイアウトやテーマについての提案をいただきました。現在qooqテーマを適応中です。 語尾を自動でつけるプログラムを作りたいという要望をいただきました。是非紹介したいですがどの言語でどのようなプログラムかなど、お問い合わせフォームで詳しく教えてください!

最近の出来事

最近の出来事
寿司打お勧め75位♪(練習モードだけど)

アンケート

Welcome!

「プログラミング独学ブログ」へようこそ。 Yakinyといいます。幅広い範囲で投稿していますので、ぜひ過去の記事も見てみてください!!コメントも大歓迎です!更新がとまってしまって申し訳ございません

お問い合わせ

名前

メール *

メッセージ *

QooQ