2023/06/07(水) [n年前の日記]
#1 [python] tkinterのmessageboxでフォントサイズを変更したかったけど無理だった
Windows10 x64 22H2 + Python 3.10.10 で、tkinter を使ってメッセージボックス(messagebox)を表示したいと思った。
表示するだけなら、以下のような感じになる。
_01_showmessageboxtk.py
実行すると以下。Enterキーを叩いたらOKボタンが押されて、ダイアログは閉じてくれた。
表示するだけなら、以下のような感じになる。
_01_showmessageboxtk.py
import tkinter as tk from tkinter import messagebox text = "This message is temporary.\nIt is displayed using tkinter's messagebox." title = "Title" root = tk.Tk() root.withdraw() messagebox.showinfo(title, text)
- root.withdraw() を呼ぶことで、tkinter のルートウインドウを表示しない状態にしている。
実行すると以下。Enterキーを叩いたらOKボタンが押されて、ダイアログは閉じてくれた。
◎ フォントサイズを変更したい :
これではフォントサイズが小さ過ぎる。フォントサイズを大きくして目立つようにしたい。
方法をググってみたのだけど、これがちょっと難しい。Mac や Linux なら、tkinter.messagebox のフォント種類やフォントサイズを変更することもできなくもないらしいのだけど…。
_How to set font of a messagebox with Python tkinter? - Stack Overflow
_python - Control Font in tkMessageBox - Stack Overflow
しかし、Windows上で動いてる tkinter は、Windowsのネイティブなメッセージボックスを使ってるからフォントサイズ等は変更できないそうで。ギャフン。
_python 3.x - how to change font size of messages inside messagebox.showinfo(message='Hello') in tkinter python3.7 - Stack Overflow
方法をググってみたのだけど、これがちょっと難しい。Mac や Linux なら、tkinter.messagebox のフォント種類やフォントサイズを変更することもできなくもないらしいのだけど…。
_How to set font of a messagebox with Python tkinter? - Stack Overflow
_python - Control Font in tkMessageBox - Stack Overflow
しかし、Windows上で動いてる tkinter は、Windowsのネイティブなメッセージボックスを使ってるからフォントサイズ等は変更できないそうで。ギャフン。
_python 3.x - how to change font size of messages inside messagebox.showinfo(message='Hello') in tkinter python3.7 - Stack Overflow
◎ messageboxを諦める :
幸い、「こういう処理をしたよ」と表示して、Enterキーを叩けばダイアログが閉じる ―― それだけで済むスクリプトを書いていたので、tkinter のルートウインドウにラベルとボタンを追加して済ませてしまうことにした。
_02_showmessageboxtk_root.py
_02_showmessageboxtk_root.py
import tkinter as tk text = "This message is temporary.\nIt is displayed using tkinter's root." title = "Title" root = tk.Tk() lbl = tk.Label(root, text=text, font=("Consolas", 20), justify="left") lbl.pack() btn = tk.Button(root, text="OK", command=root.destroy, font=("Consolas", 14)) btn.pack() root.mainloop()
- Label や Button に対しては、font=("フォント種類", フォントサイズ) が指定できる。
- Label 内で、改行を含む複数行を表示、かつ、左揃えにしたい場合、justify="left" を指定する。
- root.destroy() を呼べば、ルートウインドウを破棄できる。(.mainloop() から抜ける?)
◎ ショートカットキーを割り当て :
前述の表示結果で目的は果たせそうだけど、messagebox と違って、Enterキーを叩いただけでは閉じてくれない…。TABキーを叩いてボタンにフォーカスを移してSPACEキーを叩かないと、ボタンが押せない…。
ルートウインドウに、EnterキーやEscキーの割り当てをして、それらのキーが押されたら終了するようにしてみた。
_03_showmessageboxtk_root2.py
見た目は前述の結果と変わらないけど、Enterキー、もしくはEscキーを叩けば、ウインドウが閉じてくれるようになった。
ルートウインドウに、EnterキーやEscキーの割り当てをして、それらのキーが押されたら終了するようにしてみた。
_03_showmessageboxtk_root2.py
import tkinter as tk def close_win(e): root.destroy() text = "This message is temporary.\nIt is displayed using tkinter's root." title = "Title" root = tk.Tk() lbl = tk.Label(root, text=text, font=("Consolas", 20), justify="left") lbl.pack() btn = tk.Button(root, text="OK", command=root.destroy, font=("Consolas", 14)) btn.pack() btn.focus() root.bind("<Return>", lambda e: close_win(e)) root.bind("<Escape>", lambda e: close_win(e)) root.mainloop()
- .bind() で、キーの割り当てができる。
- .focus() で、そのウィジェットをあらかじめフォーカスしておくことができる。
見た目は前述の結果と変わらないけど、Enterキー、もしくはEscキーを叩けば、ウインドウが閉じてくれるようになった。
[ ツッコむ ]
以上です。