1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Tkinter CookBook ~フォントビューワー~

Last updated at Posted at 2018-10-19

#Tkinter CookBook2

#前提

###1. 実行環境
本ページで記載しているプログラムコードはWindows10, python3.6で実行できることを確認しています。

###2. 必要なpythonモジュール
特に必要ありません。

###3. 本投稿の目的
tkinterで使えるフォントについて整理します。

#それでは、はじめましょう

View_Font.py

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as font

##############################################################################
#コンボボックス
class Use_Combobox(ttk.Combobox):
    def __init__(self, master=None):
        ttk.Combobox.__init__(self, master)

        self["font"] = ("Helvetica", 15)
##############################################################################
#ラベル
class Use_Label(tk.Label):
    def __init__(self, master=None):
        tk.Label.__init__(self, master)

        self["font"] = font.Font(self,family="System",size=15)
        self["anchor"] = "e"
        self["padx"] = 10
        self["pady"] = 10

    def Change_font(self, event=None):
        type = comb.get()
        self["font"] = font.Font(self,family=type,size=15)
##############################################################################
root = tk.Tk()

comb = Use_Combobox(root)
comb["values"] = font.families()
comb.grid(column=0, row=0)

label = Use_Label(root)
label["text"] = "aA1234567890=_\\"
label.grid(column=0, row=1)

root.bind("<Return>", label.Change_font)

root.mainloop()

上記のプログラムを実行すると、下のような画面が表示されます。

C2_step1.png

C2_step2.png

このプログラムが行っていることは

  1. **「Combbox」**オブジェクトを配置
  2. **「Label」**オブジェクトを配置
  3. 画面全体にキーバインドを設定

です。

###1. 「Combbox」オブジェクトを配置

「Combbox」オブジェクトを配置
comb = Use_Combobox(root)
comb["values"] = font.families()
comb.grid(column=0, row=0)

ここはcookbook1で何度も行いましたね。クラスオブジェクトを使用して**「Combbox」**オブジェクトを作成します。
**["values"]「Combbox」オブジェクトで表示する値を格納します。
ここではフォントを格納したいので、
「font.families()」**を格納します。

tkinterでより細かくフォントを設定したい場合は、tkinter.fontモジュールをimportします。fontモジュールの機能として**families()が存在し、これは使用できるフォント名をリスト型で返してくれます。これを["values"]**に格納しています。

###2. 「Label」オブジェクトを配置

「Label」オブジェクトを配置
label = Use_Label(root)
label["text"] = "aA1234567890=_\\"
label.grid(column=0, row=1)

これも、上記と同じですね。クラスオブジェクトを使用して、**「Label」オブジェクトを作成。["text"]**に文字を格納します。
この文字はフォントを変化させたときに変化具合を見るための文字なので好きな文字にしましょう。

###3. 画面全体にキーバインドを設定

キーバインドを設定
root.bind("<Return>", label.Change_font)

bindは現在アクティブになっているオブジェクト上で指定したキーが押された場合に行う動作を指定します。
上の記述を日本語で書けば、作成した画面オブジェクトを選択しているときにエンターキーを押すと、label.Change_fontを実行します、となります。

実際は、bindを設定できるオブジェクトはrootだけに限りません。ただし、root以外ではそのオブジェクトがアクティブになっているのかどうかをプログラムが判断しにくいのです。
またアクティブになっているというのは普通にコンピュータを使用しているときにも重要な概念です。例えばインターネットブラウザで検索をしようと思い文字を入力したときに、ブラウザの検索フォームへ文字が入力されるのは検索フォームがアクティブになっているためです。

Change_font
#ラベル
class Use_Label(tk.Label):
    def __init__(self, master=None):
        tk.Label.__init__(self, master)

        self["font"] = font.Font(self,family="System",size=15)
        self["anchor"] = "e"
        self["padx"] = 10
        self["pady"] = 10

    def Change_font(self, event=None):
        type = comb.get()
        self["font"] = font.Font(self,family=type,size=15)

またlabel.Change_fontは**「Label」オブジェクトが持つメソッドです。キーバインドを設定する際には、メソッドの引数としてselfeventを指定します。ただし、eventはevent=None**と書く方が後々良いことがある場合が多いです。

eventにはbindでこのメソッドを呼び出した場合に値が入ります。裏を返せば、bindで呼び出さず、通常のインスタンスメソッドとして呼び出した場合に、selfには値が入るが、eventには値が入らず、エラーとなってしまいます。これを防ぐためにデフォルトの値としてNoneを格納しておき、bindで呼び出した場合のみ値が入るようにします。

**comb.get()は現在選択している「Combbox」**オブジェクトの値を取得します。
["font"]にフォントの設定を格納します。importしたfontモジュールが持つFontメソッドでフォントを設定します。
selfはフォントを設定するオブジェクト、familyはフォントタイプ、sizeが大きさです。

エンターキーを押すとこのメソッドが使用されるため、**「Combbox」オブジェクトの中から値を選択し、エンターキーを押すと「Label」**オブジェクトのフォントは変化します。

##終わりに

いかがだったでしょうか。フォントについての理解が深まれば良きことです。

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?