mieki256's diary



2023/06/07(水) [n年前の日記]

#1 [python] tkinterのmessageboxでフォントサイズを変更したかったけど無理だった

Windows10 x64 22H2 + Python 3.10.10 で、tkinter を使ってメッセージボックス(messagebox)を表示したいと思った。

表示するだけなら、以下のような感じになる。

_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)

実行すると以下。Enterキーを叩いたらOKボタンが押されて、ダイアログは閉じてくれた。

tkinter_messagebox_ss01.png

フォントサイズを変更したい :

これではフォントサイズが小さ過ぎる。フォントサイズを大きくして目立つようにしたい。

方法をググってみたのだけど、これがちょっと難しい。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
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() から抜ける?)

tkinter_messagebox_ss02.png

ショートカットキーを割り当て :

前述の表示結果で目的は果たせそうだけど、messagebox と違って、Enterキーを叩いただけでは閉じてくれない…。TABキーを叩いてボタンにフォーカスを移してSPACEキーを叩かないと、ボタンが押せない…。

ルートウインドウに、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キーを叩けば、ウインドウが閉じてくれるようになった。

以上、1 日分です。

過去ログ表示

Prev - 2023/06 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project