今日も見に来てくださって、ありがとうございます。石川さんです。
またしても、tkinterのフォントについて調べています。先日は、事前定義されたフォントの一覧を出力してみました。本家のページには直接修正せずに、コピーして使ってね、と書いてありました。直接修正する、ということがどのようなことを指すのかちょっとわかりにくかったので、実際に試してみました。
最終イメージ
ソースコード
import tkinter as tk import tkinter.font as tkFont class App(tk.Tk): def __init__(self): super().__init__() self.title("Font test") self.geometry("600x180") font = tkFont.nametofont("TkFixedFont") print(font,font["size"]) tk.Label(self,text="初期値をセット",font=font).pack() font["size"] = 30 tk.Label(self,text="サイズを大きく変更したラベル",font=font).pack() font = tkFont.nametofont("TkFixedFont") print(font,font["size"]) tk.Label(self,text="再度フォントを取得してセット",font=font).pack() font = tkFont.nametofont("TkFixedFont").copy() print(font,font["size"]) font["size"] = 10 tk.Label(self,text="コピーしたフォントをセット",font=font).pack() font = tkFont.nametofont("TkFixedFont") print(font,font["size"]) print(tkFont.names()) if __name__ == "__main__": app = App() app.mainloop()
説明
先日出力したフォント名一覧の中から、TkFixedFont
を選んでテストしてみました。固定長のフォントですね。ぼくの環境はWindows10ですので、これには「MS ゴシック」が割り当てられていました。まずは、10行目で、この名称からフォントを取得します。フォントとサイズは、print
してみた結果、TkFixedFont
と10でした。
で、まずは、12行目でこのフォントを使って、ラベルを作成してみます。これは、サイズ10のラベルを出力することを期待していました。そして、その後、フォントサイズを30にセットして、変更したフォントを使ってラベルを作成します。当然これはサイズ30のラベルを出力することを期待しています。
次に、もう一度同じフォントですが、15行目で名称からフォントを取得しました。このようにした時に、最初のサイズ10のフォントを取得するのか、セットしたサイズ30のフォントが取得できるのかを調べたかったのです。期待としては、サイズ10のフォントが取得できるのかな、と、思っていました。
ここまででいったん出力してみたところ、なんと、すべて同じサイズ30という結果になりました。こんなイメージです。
結果から、TkFixedFontという名前のフォントは、すべて同じ設定で出力されているようです。別途設定してみたところ、すべて同時に変更されることを確認しました。
これらの定義済みのフォントはOSの設定値から取得していて、OSの設定値が変更されるとtkinterが自動で取得している、ということでした。ユーザが値を設定するとおそらくその自動で取得することができなくなってしまうから、変更しないように、ということだったのですね。
と、いうことで、コピーはどうするのでしょうか、と、やってみたのが18行目です。フォントを取得して、.copy()
と記載しただけです。サイズを変更してセットしてみると、見事、最後の一つだけサイズが10にセットされたラベルが作成できました。フォントの名前は実行するたびに替わっていて、最初に確認したときはfont7で、1ずつインクリメントしていました。
最後に、この新しい名前のフォントが登録されているか、確認してみましたが、入っていませんでした。
まとめ
定義済みのフォントを変更したいときは、コピーしてから値を変更して利用する、ということですね。