Python tkinter GUI プログラミング Canvas フォントサイズの変更

 今日も見に来てくださって、ありがとうございます。石川さんです。しつこくCanvasについてやってます。

 前回、拡大縮小ができたのですけど、ふと、文字はどうなるのかなぁ、と、試してみたところ、ぜんぜん追従してくれませんで、大きさがちっとも変わりませんでした。スクリプトもどんどん大きくなってきたので、別のスクリプトで実験したいと思います。

出来上がりイメージ

実行してすぐのフォントの大きさ
しばらくしてからのフォントの大きさ

 はい、放っておくと、どんどん字が大きくなっていきます。

ソースコード

import tkinter as tk
import tkinter.font as tkFont

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Change Canvas text size")
        self.geometry("400x200")
        
        self.canvas = tk.Canvas(self, background="white")
        self.canvas.pack(fill=tk.BOTH)
        
        self.text = self.canvas.create_text(200,100,text="Change?")
        
        self.resize_font()
    
    def resize_font(self):
        fontName = self.canvas.itemcget(self.text, "font")
        font = tkFont.nametofont(fontName)
        size = font["size"]
        font["size"] = size+1
        self.canvas.itemconfigure(self.text,font=font)
        self.after(500, self.resize_font)

if __name__ == "__main__":
    app = App()
    app.mainloop()

説明

 ポイントは、resize_font()メソッドです。__init__()メソッドの最後で呼び出しますが、呼び出されて処理をした後に、0.5秒後に自分自身を呼び出すように指定してあります。そう、23行目のself.after(500, self.resize_font)、この部分です。

 キャンバスの中に作成した項目の属性を取得するためには、キャンバスのitemcget()を使います。18行目でこれを使って、フォント名を取得しています。

 19行目では、tkinterfontモジュールの中のnametofont()ファンクションを使って、フォントを取得しています。20行目では、そのフォントのsizeを取り出して、21行目で+1した値をセットし直しています。

 22行目、キャンバス中に作成した項目の属性をセットするために、itemconfigure()を使います。これで、もとのフォントサイズを少しずつ大きくしてすることに成功しました。

まとめ

 フォントのサイズはポイントで指定しているので、前回の拡大縮小に合わせるのにはちょっと工夫が必要そうですね。マイナス値で指定すると、ピクセルで指定できるらしいですが、、、そのあたりは、もうちょっと調査してみます。

コメントを残す

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


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。