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

#Tkinter CookBook2

#前提

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

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

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

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

```python: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](https://qiita-image-store.s3.amazonaws.com/0/302006/f46158e5-3541-fe79-cd3c-e0e232a22cf0.png)

![C2_step2.png](https://qiita-image-store.s3.amazonaws.com/0/302006/8adc1797-2ac4-0f92-c1d8-116547fe0d4d.png)

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

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

です。

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

```python:「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」オブジェクトを配置

```python:「Label」オブジェクトを配置
label = Use_Label(root)
label["text"] = "aA1234567890=_\\"
label.grid(column=0, row=1)
```
これも、上記と同じですね。クラスオブジェクトを使用して、**「Label」**オブジェクトを作成。**["text"]**に文字を格納します。
この文字はフォントを変化させたときに変化具合を見るための文字なので好きな文字にしましょう。

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

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

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

```python: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」**オブジェクトが持つメソッドです。キーバインドを設定する際には、メソッドの引数として**self**と**event**を指定します。ただし、**event**は**event=None**と書く方が後々良いことがある場合が多いです。

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

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

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

##終わりに

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