# 25.1. `tkinter` --- Tcl/Tk の Python インタフェース

ソースコード: Lib/tkinter/__init__.py

`tkinter` パッケージ ("Tk インタフェース") は、 Tk GUI ツールキットに対する標準の Python インタフェースです。 Tk と `tkinter` はほとんどの Unix プラットフォームの他、 Windows システム上でも利用できます。 (Tk 自体は Python の一部ではありません。 Tk は ActiveState で保守されています。)

コマンドラインから `python -m tkinter` を実行すると簡素な Tk インターフェースを表示するウィンドウが開き、システムに `tkinter` が正しくインストールされたことが分かり、さらにインストールされた Tcl/Tk がどのバーションなのかが表示されるので、そのバージョンの Tcl/Tk ドキュメントを選んで読めます。

参考

Tkinter ドキュメント:

Python Tkinter Resources

  Python Tkinter Topic Guide では、Tk を Python から利用する上での情報と、その他の Tk にまつわる情報源を数多く提供しています。

TKDocs

  豊富なチュートリアルといくつかのウィジットについてのよりフレンドリなページ。

Tkinter reference: a GUI for Python

  オンラインリファレンス資料です。

Tkinter docs from effbot

  effbot.org が提供している tkinter のオンラインリファレンスです。

Programming Python

  マーク・ルッツによる書籍で、Tkinter についても広く取り上げています。

Modern Tkinter for Busy Python Developers

  Mark Roseman による書籍で、Python と Tkinter を使用した魅力的でモダンなグラフィカルユーザーインターフェースの構築方法を説明しています。

Python and Tkinter Programming

  John Graysonによる解説書 (ISBN 1-884777-81-3) です。

Tcl/Tk ドキュメント:

Tk commands

  ほとんどのコマンドは `tkinter` あるいは `tkinter.ttk` クラスから利用可能です。 手元のインストールされている Tcl/Tk のバージョンに合うように '8.6' の部分を読み替えてください。

Tcl/Tk の最近の man pages

  www.tcl.tk の最近の Tcl/Tk マニュアルです。

ActiveState Tcl ホームページ

  Tk/Tcl の開発は ActiveState で大々的に行われています。

Tcl and the Tk Toolkit

  Tcl の発明者である John Ousterhout による本です。

Practical Programming in Tcl and Tk

  Brent Welch の百科事典のような本です。

## 25.1.1. Tkinter モジュール

ほとんどの場合、本当に必要となるのは `tkinter` モジュールだけですが、他にもいくつかの追加モジュールを利用できます。Tk インタフェース自体はバイナリモジュール `_tkinter` 内にあります。このモジュールに入っているのは Tk への低レベルインタフェースであり、アプリケーションプログラマが直接使ってはなりません。`_tkinter` は通常共有ライブラリ (や DLL) になっていますが、Python インタプリタに静的にリンクされていることもあります。

Tk インタフェースモジュールの他にも `tkinter` には数多くの Python モジュールが入っています。その中でも `tkinter.constants` は最も重要なモジュールの一つですが、`tkinter` をインポートすると `tkinter.constants` は自動的にインポートされるので、以下のように `tkinter` をインポートするだけで Tkinter を使えるようになります:

    import tkinter

あるいは、よく使うやり方で以下のようにします:

    from tkinter import *

class `tkinter.``Tk`(screenName=None, baseName=None, className='Tk', useTk=1)

  `Tk` クラスは引数なしでインスタンス化します。これは Tk のトップレベルウィジェットを生成します。通常、トップレベルウィジェットはアプリケーションのメインウィンドウになります。それぞれのインスタンスごとに固有の Tcl インタプリタが関連づけられます。

`tkinter.``Tcl`(screenName=None, baseName=None, className='Tk', useTk=0)

  `Tcl()` はファクトリ関数で、 `Tk` クラスで生成するオブジェクトとよく似たオブジェクトを生成します。ただし Tk サブシステムを初期化しません。この関数は、余分なトップレベルウィンドウを作る必要がなかったり、 (X サーバを持たない Unix/Linux システムなどのように) 作成できない環境において Tcl インタプリタを駆動したい場合に便利です。 `Tcl()` で生成したオブジェクトに対して `loadtk()` メソッドを呼び出せば、トップレベルウィンドウを作成 (して、Tk サブシステムを初期化) します。

Tk をサポートしているモジュールには、他にも以下のようなモジュールがあります:

`tkinter.scrolledtext`

  垂直スクロールバー付きのテキストウィジェットです。

`tkinter.colorchooser`

  ユーザに色を選択させるためのダイアログです。

`tkinter.commondialog`

  このリストの他のモジュールが定義しているダイアログの基底クラスです。

`tkinter.filedialog`

  ユーザが開きたいファイルや保存したいファイルを指定できるようにする共通のダイアログです。

`tkinter.font`

  フォントの扱いを補助するためのユーティリティです。

`tkinter.messagebox`

  標準的な Tk のダイアログボックスにアクセスします。

`tkinter.simpledialog`

  基本的なダイアログと便宜関数 (convenience function) です。

`tkinter.dnd`

  `tkinter` 用のドラッグアンドドロップのサポートです。実験的なサポートで、Tk DND に置き替わった時点で撤廃されるはずです。

`turtle`

  Tk ウィンドウ上でタートルグラフィックスを実現します。

## 25.1.2. Tkinter お助け手帳

この節は、 Tk や Tkinter を全て網羅したチュートリアルを目指しているわけではありません。むしろ、Tkinter のシステムを学ぶ上での指針を示すための、その場しのぎ的なマニュアルです。

謝辞:

- Tk は John Ousterhout が Berkeley の在籍中に作成しました。

- Tkinter は Steen Lumholt と Guido van Rossum が作成しました。

- この Life Preserver は Virginia 大学の Matt Conway 他が執筆しました。

- HTML レンダリングやたくさんの編集は、Ken Manheimer が FrameMaker 版から行いました。

- Fredrik Lundh はクラスインタフェース詳細な説明を書いたり内容を改訂したりして、現行の Tk 4.2 に合うようにしました。

- Mike Clarkson はドキュメントを LaTeX 形式に変換し、リファレンスマニュアルのユーザインタフェースの章をコンパイルしました。

### 25.1.2.1. この節の使い方

この節は二つの部分で構成されています: 前半では、背景となることがらを (大雑把に) 網羅しています。後半は、キーボードの横に置けるような手軽なリファレンスになっています。

「○○するにはどうしたらよいですか」という形の問いに答えようと思うなら、まず Tk で「○○する」方法を調べてから、このドキュメントに戻ってきてその方法に対応する `tkinter` の関数呼び出しに変換するのが多くの場合最善の方法になります。Python プログラマが Tk ドキュメンテーションを見れば、たいてい正しい Python コマンドの見当をつけられます。従って、Tkinter を使うには Tk についてほんの少しだけ知っていればよいということになります。このドキュメントではその役割を果たせないので、次善の策として、すでにある最良のドキュメントについていくつかヒントを示しておくことにしましょう:

- Tk の man ページのコピーを手に入れるよう強く勧めます。とりわけ最も役立つのは `manN` ディレクトリ内にあるマニュアルです。`man3` のマニュアルページは Tk ライブラリに対する C インタフェースについての説明なので、スクリプト書きにとって取り立てて役に立つ内容ではありません。

- Addison-Wesley は John Ousterhout の書いた Tcl and the Tk Toolkit (ISBN 0-201-63337-X) という名前の本を出版しています。この本は初心者向けの Tcl と Tk の良い入門書です。内容は網羅的ではなく、詳細の多くは man ページ任せにしています。

- たいていの場合、`tkinter/__init__.py` は参照先としての最後の手段ですが、それ以外の手段で調べても分からない場合には救いの地になるかもしれません。

### 25.1.2.2. 簡単な Hello World プログラム

    import tkinter as tk

    class Application(tk.Frame):
        def __init__(self, master=None):
            super().__init__(master)
            self.master = master
            self.pack()
            self.create_widgets()

        def create_widgets(self):
            self.hi_there = tk.Button(self)
            self.hi_there["text"] = "Hello World\n(click me)"
            self.hi_there["command"] = self.say_hi
            self.hi_there.pack(side="top")

            self.quit = tk.Button(self, text="QUIT", fg="red",
                                  command=self.master.destroy)
            self.quit.pack(side="bottom")

        def say_hi(self):
            print("hi there, everyone!")

    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()

## 25.1.3. Tcl/Tk を (本当に少しだけ) 見渡してみる

クラス階層は複雑に見えますが、実際にプログラムを書く際には、アプリケーションプログラマはほとんど常にクラス階層の最底辺にあるクラスしか参照しません。

注釈:

- クラスのいくつかは、特定の関数を一つの名前空間下にまとめるために提供されています。こうしたクラスは個別にインスタンス化するためのものではありません。

- `Tk` クラスはアプリケーション内で一度だけインスタンス化するようになっています。アプリケーションプログラマが明示的にインスタンス化する必要はなく、他のクラスがインスタンス化されると常にシステムが作成します。

- `Widget` クラスもまた、インスタンス化して使うようにはなっていません。このクラスはサブクラス化して「実際の」ウィジェットを作成するためのものです。(C++ で言うところの、 '抽象クラス (abstract class)' です)。

このリファレンス資料を活用するには、Tk の短いプログラムを読んだり、 Tk コマンドの様々な側面を知っておく必要がままあるでしょう。(下の説明の `tkinter` 版は、基本的な Tk プログラムと Tkinter との対応関係 節を参照してください。)

Tk スクリプトは Tcl プログラムです。全ての Tcl プログラムに同じく、 Tk スクリプトはトークンをスペースで区切って並べます。 Tk ウィジェットとは、ウィジェットの クラス 、ウィジェットの設定を行う オプション 、そしてウィジェットに役立つことをさせる アクション を組み合わせたものに過ぎません。

Tk でウィジェットを作るには、常に次のような形式のコマンドを使います:

    classCommand newPathname options

classCommand

  どの種類のウィジェット (ボタン、ラベル、メニュー、...) を作るかを表します。

newPathname

  作成するウィジェットにつける新たな名前です。Tk 内の全ての名前は一意になっていなければなりません。一意性を持たせる助けとして、 Tk 内のウィジェットは、ファイルシステムにおけるファイルと同様、 パス名 (pathname) を使って名づけられます。トップレベルのウィジェット、すなわち ルート は `.` (ピリオド) という名前になり、その子ウィジェット階層もピリオドで区切ってゆきます。ウィジェットの名前は、例えば `.myApp.controlPanel.okButton` のようになります。

options

  ウィジェットの見た目を設定します。場合によってはウィジェットの挙動も設定します。オプションはフラグと値がリストになった形式をとります。 Unix のシェルコマンドのフラグと同じように、フラグの前には '-' がつき、複数の単語からなる値はクオートで囲まれます。

例えば:

    button   .fred   -fg red -text "hi there"
       ^       ^     \______________________/
       |       |                |
     class    new            options
    command  widget  (-opt val -opt val ...)

ウィジェットを作成すると、ウィジェットへのパス名は新しいコマンドになります。この新たな widget command は、プログラマが新たに作成したウィジェットに action を実行させる際のハンドル (handle) になります。C では someAction(fred, someOptions) と表し、 C++ では fred.someAction(someOptions) と表すでしょう。Tkでは:

    .fred someAction someOptions

のようにします。オブジェクト名 `.fred` はドットから始まっている点に注意してください。

読者の想像の通り、 someAction に指定できる値はウィジェットのクラスに依存しています: fred がボタンなら `.fred disable` はうまくいきます (fred はグレーになります) が、fred がラベルならうまくいきません (Tkではラベルの無効化をサポートしていないからです)。

someOptions に指定できる値はアクションの内容に依存しています。 `disable` のようなアクションは引数を必要としませんが、テキストエントリボックスの `delete` コマンドのようなアクションにはテキストを削除する範囲を指定するための引数が必要になります。

## 25.1.4. 基本的な Tk プログラムと Tkinter との対応関係

Tk のクラスコマンドは、Tkinter のクラスコンストラクタに対応しています。

    button .fred                =====>  fred = Button()

オブジェクトの親 (master) は、オブジェクトの作成時に指定した新たな名前から非明示的に決定されます。Tkinter では親を明示的に指定します。

    button .panel.fred          =====>  fred = Button(panel)

Tk の設定オプションは、ハイフンをつけたタグと値の組からなるリストで指定します。Tkinter では、オプションはキーワード引数にしてインスタンスのコンストラクタに指定したり、 `config()` にキーワード引数を指定して呼び出したり、インデクス指定を使ってインスタンスに代入したりして設定します。オプションの設定については オプションの設定 節を参照してください。

    button .fred -fg red        =====>  fred = Button(panel, fg="red")
    .fred configure -fg red     =====>  fred["fg"] = red
                                OR ==>  fred.config(fg="red")

Tk でウィジェットにアクションを実行させるには、ウィジェット名をコマンドにして、その後にアクション名を続け、必要に応じて引数 (オプション) を続けます。Tkinter では、クラスインスタンスのメソッドを呼び出して、ウィジェットのアクションを呼び出します。あるウィジェットがどんなアクション (メソッド) を実行できるかは、`tkinter/__init__.py` モジュール内にリストされています。

    .fred invoke                =====>  fred.invoke()

Tk でウィジェットを packer (ジオメトリマネージャ) に渡すには、pack コマンドをオプション引数付きで呼び出します。Tkinter では Pack クラスがこの機能すべてを握っていて、様々な pack の形式がメソッドとして実装されています。`tkinter` のウィジェットはすべて packer からサブクラス化されているため、pack 操作にまつわるすべてのメソッドを継承しています。Form ジオメトリマネージャに関する詳しい情報については `tkinter.tix` モジュールのドキュメントを参照してください。

    pack .fred -side left       =====>  fred.pack(side="left")

## 25.1.5. Tk と Tkinter はどのように関わっているのか

上から下に、呼び出しの階層構造を説明してゆきます:

あなたのアプリケーション (Python)

  まず、Python アプリケーションが `tkinter` を呼び出します。

tkinter (Python パッケージ)

  上記の呼び出し (例えば、ボタンウィジェットの作成) は、`tkinter` パッケージ内で実装されており、Python で書かれています。この Python で書かれた関数は、コマンドと引数を解析して変換し、あたかもコマンドが Python スクリプトではなく Tk スクリプトから来たようにみせかけます。

_tkinter (C)

  上記のコマンドと引数は `_tkinter` (先頭にアンダースコアです) 拡張モジュール内の C 関数に渡されます。

Tk ウィジェット (C および Tcl)

  上記の C 関数は、Tk ライブラリを構成する C 関数の入った別の C モジュールへの呼び出しを行えるようになっています。Tk は C と少しの Tcl を使って実装されています。Tk ウィジェットの Tcl 部分は、ウィジェットのデフォルト動作をバインドするために使われ、Python `tkinter` パッケージがインポートされた時に一度だけ実行されます (ユーザがこの過程を目にすることはありません)。

Tk (C)

  Tk ウィジェットの Tk 部分で実装されている最終的な対応付け操作によって...

Xlib (C)

  Xlib ライブラリがスクリーン上にグラフィックスを描きます。

## 25.1.6. 簡単なリファレンス

### 25.1.6.1. オプションの設定

オプションは、色やウィジェットの境界線幅などを制御します。オプションの設定には三通りの方法があります:

オブジェクト生成時、キーワード引数を使用する

      fred = Button(self, fg="red", bg="blue")

オブジェクト生成後、オプション名を辞書インデックスのように扱う

      fred["fg"] = "red"
      fred["bg"] = "blue"

オブジェクト生成後に、config()メソッドを使って複数の属性を更新する

      fred.config(fg="red", bg="blue")

オプションとその振る舞いに関する詳細な説明は、該当するウィジェットの Tk の man ページを参照してください。

man ページには、各ウィジェットの "STANDARD OPTIONS (標準オプション)" と "WIDGET SPECIFIC OPTIONS (ウィジェット固有のオプション)" がリストされていることに注意してください。前者は多くのウィジェットに共通のオプションのリストで、後者は特定のウィジェットに特有のオプションです。標準オプションの説明は man ページの options(3) にあります。

このドキュメントでは、標準オプションとウィジェット固有のオプションを区別していません。オプションによっては、ある種のウィジェットに適用できません。あるウィジェットがあるオプションに対応しているかどうかは、ウィジェットのクラスによります。例えばボタンには `command` オプションがありますが、ラベルにはありません。

あるウィジェットがどんなオプションをサポートしているかは、ウィジェットの man ページにリストされています。また、実行時にウィジェットの `config()` メソッドを引数なしで呼び出したり、 `keys()` メソッドを呼び出したりして問い合わせることもできます。メソッド呼び出しを行うと辞書型の値を返します。この辞書は、オプションの名前がキー (例えば `'relief'`) になっていて、値が 5 要素のタプルになっています。

`bg` のように、いくつかのオプションはより長い名前を持つ共通のオプションに対する同義語になっています (`bg` は "background" を短縮したものです)。短縮形のオプション名を `config()` に渡すと、 5 要素ではなく 2 要素のタプルを返します。このタプルには、同義語の名前と「本当の」オプション名が入っています (例えば `('bg', 'background')`)。

インデックス | 意味 | 使用例
--- | --- | ---
0 | オプション名 | `'relief'`
1 | データベース検索用のオプション名 | `'relief'`
2 | データベース検索用のオプションクラス | `'Relief'`
3 | デフォルト値 | `'raised'`
4 | 現在の値 | `'groove'`

以下はプログラム例です:

    >>> print(fred.config())
    {'relief': ('relief', 'relief', 'Relief', 'raised', 'groove')}

もちろん、実際に出力される辞書には利用可能なオプションが全て表示されます。上の表示例は単なる例にすぎません。

### 25.1.6.2. Packer

packer は Tk のジオメトリ管理メカニズムの一つです。ジオメトリマネージャは、複数のウィジェットの位置を、それぞれのウィジェットを含むコンテナ - 共通の マスタ (master) からの相対で指定するために使います。やや扱いにくい placer (あまり使われないのでここでは取り上げません) と違い、packer は定性的な関係を表す指定子 - 上 (above) 、 〜の左 (to the left of) 、 引き延ばし (filling) など - を受け取り、厳密な配置座標の決定を全て行ってくれます。

どんな マスタ ウィジェットでも、大きさは内部の "スレイブ (slave) ウィジェット" の大きさで決まります。 packer は、スレイブウィジェットを pack 先のマスタウィジェット中のどこに配置するかを制御するために使われます。望みのレイアウトを達成するには、ウィジェットをフレームにパックし、そのフレームをまた別のフレームにパックできます。さらに、一度パックを行うと、それ以後の設定変更に合わせて動的に並べ方を調整します。

ジオメトリマネージャがウィジェットのジオメトリを確定するまで、ウィジェットは表示されないので注意してください。初心者のころにはよくジオメトリの確定を忘れてしまい、ウィジェットを生成したのに何も表示されず驚くことになります。ウィジェットは、(例えば packer の `pack()` メソッドを適用して) ジオメトリを確定した後で初めて表示されます。

pack() メソッドは、キーワード引数つきで呼び出せます。キーワード引数は、ウィジェットをコンテナ内のどこに表示するか、メインのアプリケーションウィンドウをリサイズしたときにウィジェットがどう振舞うかを制御します。以下に例を示します:

    fred.pack()                     # defaults to side = "top"
    fred.pack(side="left")
    fred.pack(expand=1)

### 25.1.6.3. Packer のオプション

packer と packer の取りえるオプションについての詳細は、man ページや John Ousterhout の本の183ページを参照してください。

anchor

  アンカーの型です。 packer が区画内に各スレイブを配置する位置を示します。

expand

  ブール値で、 `0` または `1` になります。

fill

  指定できる値は `'x'` 、 `'y'` 、 `'both'` 、 `'none'` です。

ipadx および ipady

  スレイブウィジェットの各側面の内側に行うパディング幅を表す長さを指定します。

padx および pady

  スレイブウィジェットの各側面の外側に行うパディング幅を表す長さを指定します。

side

  指定できる値は `'left'`, `'right'`, `'top'`, `'bottom'` です。

### 25.1.6.4. ウィジェット変数を関連付ける

ウィジェットによっては、(テキスト入力ウィジェットのように) 特殊なオプションを使って、現在設定されている値をアプリケーション内の変数に直接関連付けできます。このようなオプションには `variable`, `textvariable`, `onvalue`, `offvalue` および `value` があります。この関連付けは双方向に働きます: 変数の値が何らかの理由で変更されると、関連付けされているウィジェットも更新され、新しい値を反映します。

残念ながら、現在の `tkinter` の実装では、`variable` や `textvariable` オプションでは任意の Python の値をウィジェットに渡せません。この関連付け機能がうまく働くのは、`tkinter` 内で Variable というクラスからサブクラス化されている変数によるオプションだけです。

Variable には、 `StringVar`, `IntVar`, `DoubleVar`, `BooleanVar` といった便利なサブクラスがすでにすでに数多く定義されています。こうした変数の現在の値を読み出したければ、 `get()` メソッドを呼び出します。また、値を変更したければ `set()` メソッドを呼び出します。このプロトコルに従っている限り、それ以上なにも手を加えなくてもウィジェットは常に現在値に追従します。

例えば:

    class App(Frame):
        def __init__(self, master=None):
            super().__init__(master)
            self.pack()

            self.entrythingy = Entry()
            self.entrythingy.pack()

            # here is the application variable
            self.contents = StringVar()
            # set it to some value
            self.contents.set("this is a variable")
            # tell the entry widget to watch this variable
            self.entrythingy["textvariable"] = self.contents

            # and here we get a callback when the user hits return.
            # we will have the program print out the value of the
            # application variable when the user hits return
            self.entrythingy.bind('<Key-Return>',
                                  self.print_contents)

        def print_contents(self, event):
            print("hi. contents of entry is now ---->",
                  self.contents.get())

### 25.1.6.5. ウィンドウマネージャ

Tk には、ウィンドウマネジャとやり取りするための `wm` というユーティリティコマンドがあります。`wm` コマンドにオプションを指定すると、タイトルや配置、アイコンビットマップなどを操作できます。`tkinter` では、こうしたコマンドは `Wm` クラスのメソッドとして実装されています。トップレベルウィジェットは `Wm` クラスからサブクラス化されているので、`Wm` のメソッドを直接呼び出せます。

あるウィジェットの入っているトップレベルウィンドウを取得したい場合、大抵は単にウィジェットのマスタを参照するだけですみます。とはいえ、ウィジェットがフレーム内にパックされている場合、マスタはトップレベルウィンドウではありません。任意のウィジェットの入っているトップレベルウィンドウを知りたければ `_root()` メソッドを呼び出してください。このメソッドはアンダースコアがついていますが、これはこの関数が `Tkinter` の実装の一部であり、Tk の機能に対するインタフェースではないことを示しています。

以下に典型的な使い方の例をいくつか挙げます:

    import tkinter as tk

    class App(tk.Frame):
        def __init__(self, master=None):
            super().__init__(master)
            self.pack()

    # create the application
    myapp = App()

    #
    # here are method calls to the window manager class
    #
    myapp.master.title("My Do-Nothing Application")
    myapp.master.maxsize(1000, 400)

    # start the program
    myapp.mainloop()

### 25.1.6.6. Tk オプションデータ型

anchor

  指定できる値はコンパスの方位です: `"n"` 、 `"ne"` 、 `"e"` 、 `"se"` 、 `"s"` 、 `"sw"` 、 `"w"` 、 `"nw"` 、および `"center"` 。

bitmap

  八つの組み込み、名前付きビットマップ: `'error'` 、 `'gray25'` 、 `'gray50'` 、 `'hourglass'` 、 `'info'` 、 `'questhead'` 、 `'question'` 、 `'warning'` 。 X ビットマップファイル名を指定するために、 `"@/usr/contrib/bitmap/gumby.bit"` のような `@` を先頭に付けたファイルへの完全なパスを与えてください。

boolean

  整数 0 または 1 、あるいは、文字列 `"yes"` または `"no"` を渡すことができます。

callback

  これは引数を取らない Python 関数ならどれでも構いません。例えば:

      def print_it():
          print("hi there")
      fred["command"] = print_it

color

  色は rgb.txt ファイルの X カラーの名前か、または RGB 値を表す文字列として与えられます。 RGB 値を表す文字列は、4ビット: `"#RGB"`, 8 bit: `"#RRGGBB"`, 12 bit: `"#RRRGGGBBB"`, あるいは、16 bit `"#RRRRGGGGBBBB"` の範囲を取ります。ここでは、R,G,B は適切な十六進数ならどんなものでも表します。詳細は、Ousterhout の本の160ページを参照してください。

cursor

  `cursorfont.h` の標準Xカーソル名を、接頭語 `XC_` 無しで使うことができます。例えば、handカーソル(`XC_hand2`)を得るには、文字列 `"hand2"` を使ってください。あなた自身のビットマップとマスクファイルを指定することもできます。 Ousterhout の本の179ページを参照してください。

distance

  スクリーン上の距離をピクセルか絶対距離のどちらかで指定できます。ピクセルは数値として与えられ、絶対距離は文字列として与えられます。絶対距離を表す文字列は、単位を表す終了文字 (センチメートルには `c` 、インチには `i` 、ミリメートルには `m` 、プリンタのポイントには `p`)を伴います。例えば、3.5インチは `"3.5i"` と表現します。

font

  Tkはフォント名の形式に `{courier 10 bold}` のようなリストを使います。正の数のフォントサイズはポイント単位で使用され、負の数のサイズはピクセル単位と見なされます。

geometry

  これは `widthxheight` 形式の文字列です。ここでは、ほとんどのウィジェットに対して幅と高さピクセル単位で (テキストを表示するウィジェットに対しては文字単位で)表されます。例えば: `fred["geometry"] = "200x100"` 。

justify

  指定できる値は文字列です: `"left"` 、 `"center"` 、 `"right"` 、そして `"fill"` 。

region

  これは空白で区切られた四つの要素をもつ文字列です。各要素は指定可能な距離です(以下を参照)。例えば: `"2 3 4 5"` と `"3i 2i 4.5i 2i"` と `"3c 2c 4c 10.43c"` は、すべて指定可能な範囲です。

relief

  ウィジェットのボーダのスタイルが何かを決めます。指定できる値は: `"raised"` 、 `"sunken"` 、 `"flat"` 、 `"groove"` 、と `"ridge"` 。

scrollcommand

  これはほとんどの場合スクロールバーウィジェットの `set()` メソッドですが、1 個の引数を取るあらゆるウィジェットにもなりえます。

wrap:

  次の中の一つでなければなりません: `"none"` 、 `"char"` 、あるいは `"word"` 。

### 25.1.6.7. バインドとイベント

ウィジェットコマンドからの bind メソッドによって、あるイベントを待つことと、そのイベント型が起きたときにコールバック関数を呼び出すことができるようになります。 bind メソッドの形式は:

    def bind(self, sequence, func, add=''):

ここでは:

sequence

  は対象とするイベントの型を示す文字列です (詳細については、bind の man ページと John Ousterhout の本の201ページを参照してください)。

func

  は一引数を取り、イベントが起きるときに呼び出される Python 関数です。イベント・インスタンスが引数として渡されます。 (このように実施される関数は、一般に callbacks として知られています。)

add

  はオプションで、 `''` か `'+'` のどちらかです。空文字列を渡すことは、このイベントが関係する他のどんなバインドをもこのバインドが置き換えることを意味します。 `'+'` を使う仕方は、この関数がこのイベント型にバインドされる関数のリストに追加されることを意味しています。

例えば:

    def turn_red(self, event):
        event.widget["activeforeground"] = "red"

    self.button.bind("<Enter>", self.turn_red)

イベントのウィジェットフィールドが `turn_red()` コールバック内でどのようにアクセスされているかに注目してください。このフィールドは X イベントを捕らえたウィジェットを含んでいます。以下の表はアクセスできる他のイベントフィールドとそれらの Tk での表現方法の一覧です。Tk man ページを参照するときに役に立つでしょう。

Tk | Tkinter イベントフィールド | Tk | Tkinter イベントフィールド
--- | --- | --- | ---
%f | focus | %A | char
%h | 高さ | %E | send_event
%k | keycode | %K | keysym
%s | state | %N | keysym_num
%t | time | %T | type
%w | 幅 | %W | widget
%x | x | %X | x_root
%y | y | %Y | y_root

### 25.1.6.8. index パラメータ

多くのウィジェットにはパラメータ "index" を渡す必要があります。これらはテキストウィジェット内の特定の位置や、エントリウィジェット内の特定の文字、あるいはメニューウィジェット内の特定のメニューアイテムを指定するために使用されます。

エントリウィジェットのインデックス(インデックス、ビューインデックスなど)

  エントリウィジェットは表示されているテキスト内の文字位置を参照するオプションを持っています。テキストウィジェットにおけるこれらの特別な位置にアクセスするために、次の `tkinter` 関数を使うことができます:

テキストウィジェットのインデックス

  テキストウィジェットに対するインデックス記法はとても機能が豊富で、 Tk manページでよく説明されています。

メニューのインデックス(menu.invoke()、menu.entryconfig()など)

  メニューに対するいくつかのオプションとメソッドは特定のメニュー項目を操作します。メニューインデックスはオプションまたはパラメータのために必要とされるときはいつでも、以下のものを渡すことができます:

  - ウィジェット内の数字の先頭からの位置を指す整数。先頭は 0。

  - 文字列 `"active"`。現在カーソルがあるメニューの位置を指します。

  - 文字列 `"last"` 。最後のメニューを指します。

  - `@6` のような `@` が前に来る整数。ここでは、整数がメニューの座標系における y ピクセル座標として解釈されます。

  - 文字列 `"none"`。どんなメニューエントリもまったく指しておらず、ほとんどの場合、すべてのエントリの動作を停止させるために menu.activate() と一緒に使われます。そして、最後に、

  - メニューの先頭から一番下までスキャンしたときに、メニューエントリのラベルに一致したパターンであるテキスト文字列。このインデックス型は他すべての後に考慮されることに注意してください。その代わりに、それは `last` 、 `active` または `none` とラベル付けされたメニュー項目への一致は上のリテラルとして解釈されることを意味します。

### 25.1.6.9. 画像

様々な形式の画像を、それに対応する `tkinter.Image` のサブクラスを使って作成できます:

- XBM 形式の画像のための `BitmapImage` 。

- PGM, PPM, GIF, PNG 形式の画像のための `PhotoImage` 。 最後のは Tk 8.6 からサポートされるようになりました。

画像のどちらの型でも `file` または `data` オプションを使って作られます (その上、他のオプションも利用できます)。

`image` オプションがウィジェットにサポートされるところならどこでも、画像オブジェクトを使うことができます (例えば、ラベル、ボタン、メニュー)。これらの場合では、Tk は画像への参照を保持しないでしょう。画像オブジェクトへの最後の Python の参照が削除されたときに、画像データも削除されます。そして、どこで画像が使われていようとも、Tk は空の箱を表示します。

参考

Pillow パッケージにより、 BMP, JPEG, TIFF, WebP などの形式のサポートが追加されました。

## 25.1.7. ファイルハンドラ

Tk を使うとコールバック関数の登録や解除ができ、ファイルディスクリプタに対する入出力が可能なときに、Tk のメインループからその関数が呼ばれます。 ファイルディスクリプタ1つにつき、1つだけハンドラは登録されます。コード例です:

    import tkinter
    widget = tkinter.Tk()
    mask = tkinter.READABLE | tkinter.WRITABLE
    widget.tk.createfilehandler(file, mask, callback)
    ...
    widget.tk.deletefilehandler(file)

これらの機能は Windows では利用できません。

読み込みに使えるバイト数は分からないので、 `BufferedIOBase` クラスや `TextIOBase` クラスの `read()` メソッドおよび `readline()` メソッドを使おうとしないでください。これらは読み込みの際に、あらかじめ決められたバイト数を要求するのです。ソケットには、 `recv()` や `recvfrom()` メソッドを使うといいです。その他のファイルには、 raw 読み込みか `os.read(file.fileno(), maxbytecount)` を使ってください。

`Widget.tk.``createfilehandler`(file, mask, func)

  ファイルハンドラであるコールバック関数 func を登録します。 file 引数は、 (ファイルやソケットオブジェクトのような) `fileno()` メソッドを持つオブジェクトか、整数のファイルディスクリプタとなります。 mask 引数は、以下にある3つの定数の組み合わせの OR を取ったものです。コールバックは次のように呼ばれます:

      callback(file, mask)

`Widget.tk.``deletefilehandler`(file)

  ファイルハンドラの登録を解除します。

`tkinter.``READABLE`
`tkinter.``WRITABLE`
`tkinter.``EXCEPTION`

  mask 引数で使う定数です。