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

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

注意:

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

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

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

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

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`コマンドのようなアクションには テキストを削除する範囲を指定するための引数が必要になります。