Tkinterの使い方:フォントの指定方法

フォント指定解説ページのアイキャッチ

このページでは Tkinter で利用するウィジェットに表示するフォントを指定して変更する方法について解説します。

フォントの指定方法

 Tkinter で利用するウィジェットに表示するフォントは下記のように各ウィジェットのコンストラクタ実行時にキーワード引数 font を指定することで設定することが可能です(下記はボタンウィジェットのコンストラクタ実行時に 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 or 1 を指定
    • フォントを下線をつけない場合:False or 0 を指定
  • overstrike:フォントの取り消し線設定を指定
    • フォントに取り消し線をつける場合:True or 1 を指定
    • フォントを取り消し線をつけない場合:False or 0 を指定

tkinter.font.Font クラスの仕様的には上記の6つのキーワードを指定して設定することが可能です。

しかし、フォントファミリーの種類によっては設定が反映されないものもあるようです。

また、私の環境では overstrike 設定により取り消し線が付く事はありませんでした…。MacOS 以外の環境だと取り消し線の有無を設定できるかもしれません。

サンプルスクリプト

tkinter.Button のコンストラクタ実行時に、fonttkinter.font.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()

実行結果は下の図のようになります。

フォント設定例1

太字・斜体になり、さらに取り消し線が引かれていることが確認できると思います。

本方法でフォントを指定するメリット・デメリット

本方法を用いるメリットは下記だと思います。

  • 各種設定がキーワード引数指定できる
    • 分かりやすい
    • 必要な設定のみ行える
  • フォントの設定を確認することができる
    • 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()

実行結果は下の図のようになります。

フォント設定例2

斜体になり、さらに取り消し線が引かれていることが確認できると思います。

本方法でフォントを指定するメリット・デメリット

本方法を用いるメリットは下記だと思います。

  • import が不要でお手軽

本方法を用いデメリットは下記だと思います。

  • 各種設定がキーワード引数指定できない
    • 分かりにくい
    • 指定する要素の順番を意識する必要がある

利用できるフォントファミリー

利用できるフォントファミリーは使用している環境(特に OS)によって異なります。

どのフォントファミリーが利用できるかどうかは tkinter.fontfamilies 関数を利用する事で調べることができます。下記を実行すれば、その環境で使用可能なフォントファミリーが全て標準出力に出力されます。

使用可能なフォントファミリーの調べ方
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 クラスのインスタンスを指定する
  • フォント情報を格納したタプルで指定する

ちょっと手間がかかりますが、慣れるまでは前者の方が使いやすいかなぁと思います。慣れてきたら手軽な後者の方を使うと良いと思います。

また、フォント指定で一番一番使うのは「フォントのサイズ」指定と「太文字」指定じゃないかなぁと思います。このあたりはしっかり覚えておくと良いと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です