このページでは Tkinter で利用するウィジェットに表示するフォントを指定して変更する方法について解説します。
フォントの指定方法
Tkinter で利用するウィジェットに表示するフォントは下記のように各ウィジェットのコンストラクタ実行時にキーワード引数 font
を指定することで設定することが可能です(下記はボタンウィジェットのコンストラクタ実行時に font
を指定する例になります)。
import tkinter
app = tkinter.Tk()
app.geometry("400x300")
app.title("ボタンウィジェット")
# Button Widget
button = tkinter.Button(
app,
font=("Menlo", 50),
text="BUTTON0",
width=10,
height=2,
)
button.pack()
app.mainloop()
キーワード引数 font
へのフォント情報の指定方法は2つあります。
tkinter.font.Font
クラスのインスタンスを指定する- フォント情報を格納したタプルで指定する
tkinter.font.Font
クラスのインスタンスを指定する
1つ目は tkinter.font.Font
クラスのインスタンスを生成し、そのインスタンスをキーワード引数 font
に指定する方法です。
フォントの設定方法
tkinter.font.Font
クラスを利用するためには、事前に tkinter.font
をインポートする必要があります。
tkinter.font.Font
クラスのコンストラクタには下記をキーワード引数の形式で指定することができます。
family
:フォントファミリーを設定(文字列で指定)- 指定可能なフォントファミリーについては利用できるフォントファミリーを参照してください
size
:フォントサイズを設定(整数で指定)weight
:フォントの太さ設定を指定- フォントを太字にする場合:
tkinter.font.BOLD
or"bold"
を指定 - フォントを通常の太さにする場合:
tkinter.font.NORMAL
or"normal"
を指定
- フォントを太字にする場合:
slant
:フォントの斜体設定を指定- フォントを斜体にする場合:
tkinter.font.ITALIC
or"italic"
を指定 - フォントを斜体にしない場合:
tkinter.font.ROMAN
or"roman"
を指定
- フォントを斜体にする場合:
underline
:フォントの下線設定を指定- フォントに下線をつける場合:
True
or1
を指定 - フォントを下線をつけない場合:
False
or0
を指定
- フォントに下線をつける場合:
overstrike
:フォントの取り消し線設定を指定- フォントに取り消し線をつける場合:
True
or1
を指定 - フォントを取り消し線をつけない場合:
False
or0
を指定
- フォントに取り消し線をつける場合:
tkinter.font.Font
クラスの仕様的には上記の6つのキーワードを指定して設定することが可能です。
しかし、フォントファミリーの種類によっては設定が反映されないものもあるようです。
また、私の環境では overstrike
設定により取り消し線が付く事はありませんでした…。MacOS 以外の環境だと取り消し線の有無を設定できるかもしれません。
サンプルスクリプト
tkinter.Button
のコンストラクタ実行時に、font
に tkinter.font.Font
クラスのインスタンスを指定する場合のスクリプト例は下記のようになります。
import tkinter
import tkinter.font
app = tkinter.Tk()
app.geometry("250x100")
app.title("ボタンウィジェット")
# Font
button_font = tkinter.font.Font(
family="Menlo",
size=50,
weight=tkinter.font.BOLD,
slant="italic",
underline=True,
overstrike=True,
)
# Button Widget
button = tkinter.Button(
app,
font=button_font,
text="BUTTON0",
)
button.pack()
app.mainloop()
実行結果は下の図のようになります。
太字・斜体になり、さらに取り消し線が引かれていることが確認できると思います。
本方法でフォントを指定するメリット・デメリット
本方法を用いるメリットは下記だと思います。
- 各種設定がキーワード引数指定できる
- 分かりやすい
- 必要な設定のみ行える
- フォントの設定を確認することができる
actual
メソッドで設定確認可能
本方法を用いるデメリットは下記だと思います。
import
をするのが若干手間がかかる
スポンサーリンク
フォント情報を格納したタプルで指定する
もう一つは単純にタプルで指定する方法です。
フォントの設定方法
タプルの第 0
要素には「フォントファミリー名」、第 1
要素には「フォントサイズ」、第 2
要素から第 5
要素からは「太字設定」「斜体設定」「下線設定」「取り消し線設定」を指定します(第 2
要素から 第 5
要素の順番は入れ替えても良いようです)。
基本設定できる値は tkinter.font.Font
クラスのインスタンスを指定するで紹介したものとほぼ同じです。が、下記だけ異なるので注意してください。
- フォントの下線設定
- フォントに下線をつける場合:
"underline"
を指定 - フォントを下線をつけない場合:指定しない
- フォントに下線をつける場合:
- フォントの取り消し線設定
- フォントに取り消し線をつける場合:
"overstrike"
を指定 - フォントを取り消し線をつけない場合:指定しない
- フォントに取り消し線をつける場合:
また tkinter.font
をインポートしないと、tkinter.font.XXXX
の定数は使用できないので注意してください("xxxx"
の文字列形式で指定する事はできます)。
必ずしも第 0
要素から第 5
要素まで全て指定する必要はないです。が、第 0
要素と第 1
要素までは指定する順番が固定な点は注意が必要です。
例えば指定する要素を絞ってフォントを指定するには、下記のようにタプルを形成する必要があります(デフォルトのままで良い場合は、フォントファミリーには ""
、フォントサイズには 0
を指定すれば良いです)。
- フォントファミリーを指定する場合:
- 第
0
要素のみを指定する - 例:
font=("Helvetica")
- 第
- フォントサイズを指定する場合:
- 第
0
要素と第1
要素を指定する - 例:
font=("", 50)
- 第
- 斜体を指定する場合:
- 第
0
要素から第2
要素を指定する - 例:
font=("", 0, "italic")
- 第
サンプルスクリプト
tkinter.Button
のコンストラクタ実行時に、font
にタプルを指定する場合のスクリプト例は下記のようになります。
import tkinter
app = tkinter.Tk()
app.geometry("250x100")
app.title("ボタンウィジェット")
# Button Widget
button = tkinter.Button(
app,
font=("", 50, "italic", "underline"),
text="BUTTON0",
)
button.pack()
app.mainloop()
実行結果は下の図のようになります。
斜体になり、さらに取り消し線が引かれていることが確認できると思います。
本方法でフォントを指定するメリット・デメリット
本方法を用いるメリットは下記だと思います。
import
が不要でお手軽
本方法を用いデメリットは下記だと思います。
- 各種設定がキーワード引数指定できない
- 分かりにくい
- 指定する要素の順番を意識する必要がある
利用できるフォントファミリー
利用できるフォントファミリーは使用している環境(特に OS)によって異なります。
どのフォントファミリーが利用できるかどうかは tkinter.font
の families
関数を利用する事で調べることができます。下記を実行すれば、その環境で使用可能なフォントファミリーが全て標準出力に出力されます。
import tkinter
import tkinter.font
tkinter.Tk()
print(tkinter.font.families())
また使用可能なフォントファミリーで TEXT
に指定した文字列を画面に表示するサンプルスクリプトも紹介しています。
# -*- coding:utf-8 -*-
import tkinter
import tkinter.font
import tkinter.messagebox
# 横に並べる数
MAX_X = 10
# 縦に並べる数
MAX_Y = 20
# 表示する文字列
TEXT = "字zi80"
# 表示する文字のサイズ
FONT_SIZE = 15
# ウィンドウのサイズ
WINDOW_WIDTH = 1000
WINDOW_HEIGHT = 600
# ボタンクリック時に呼び出す関数
def button_func(event):
# イベントを発行したウィジェットを取得
button = event.widget
# ウィジェットの font の設定を取得
font_name = button.cget("font")
# フォントオブジェクトを取得
fontobj = tkinter.font.nametofont(font_name)
# フォントの設定を取得
font = fontobj.actual()
# そのフォントの名前をメッセージとして表示
tkinter.messagebox.showinfo(
font["family"],
"そのフォントは" + font["family"] + "です"
)
# メインウィンドウ作成
app = tkinter.Tk()
geostr = str(WINDOW_WIDTH) + "x" + str(WINDOW_HEIGHT)
app.geometry(geostr)
# 利用可能なフォントのタプルを作成
families = tkinter.font.families()
# 表示する位置
x = 0
y = 0
# 各ボタンの間隔
dx = WINDOW_WIDTH / MAX_X
dy = WINDOW_HEIGHT / MAX_Y
# フォントリストの添字
i = 0
# 作成したフォントのGC防止用
font_list = []
# TEXTを全フォントファミリーで表示
for family in families:
# フォントを作成
button_font = tkinter.font.Font(
family=family,
size=FONT_SIZE,
)
# フォントを指定してボタンを作成
button = tkinter.Button(
app,
text=TEXT,
font=button_font,
width=10,
height=1,
)
# 位置を調節して配置
button.place(x=x*dx, y=y*dy)
# ボタンのクリックをバインド
button.bind("", button_func)
# 位置を横にずらす
x += 1
if x >= MAX_X:
# 横に並べ終わったら縦方向にずらす
y += 1
x = 0
i += 1
# 作成したフォントを覚えておく
font_list.append(button_font)
# メインループ
app.mainloop()
実行すると使用可能なフォントファミリー分のボタンが作成され、ボタンのテキストに TEXT
で指定した文字列が各フォントファミリーで描画されます(ズレたりはみ出るたりかぶったりしていますが…)。
気に入ったフォントがあれば、そのボタンをクリックすることで、そのフォントファミリー名がメッセージボックスとして表示されます。
使用するファミリーを選ぶのに参考にはなるかと思います!スクリプト最初の定数定義のところでサイズ関連は変更できますので、ご自身の環境に合わせて使用してみてください。
まとめ
このページでは Tkinter でフォントを指定する方法について解説しました。
Tkinter でフォントを指定するには下記の2つの方法があります。
tkinter.font.Font
クラスのインスタンスを指定する- フォント情報を格納したタプルで指定する
ちょっと手間がかかりますが、慣れるまでは前者の方が使いやすいかなぁと思います。慣れてきたら手軽な後者の方を使うと良いと思います。
また、フォント指定で一番一番使うのは「フォントのサイズ」指定と「太文字」指定じゃないかなぁと思います。このあたりはしっかり覚えておくと良いと思います。