24.1. "Tkinter" --- Tcl/Tk への Python インタフェース
*****************************************************

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

Running "python -m Tkinter" from the command line should open a window
demonstrating a simple Tk interface, letting you know that "Tkinter"
is properly installed on your system, and also showing what version of
Tcl/Tk is installed, so you can read the Tcl/Tk documentation specific
to that version.

注釈: "Tkinter" モジュールは、Python 3 では "tkinter" にリネームされ
  ました 。 *2to3* ツールが自動的にソースコードの import を修正します
  。

参考: Tkinter documentation:

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

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

  Tkinter 8.5 reference: a GUI for Python
     オンラインリファレンス資料です。

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

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

  Modern Tkinter for Busy Python Developers
     Book by Mark Roseman about building attractive and modern
     graphical user interfaces with Python and Tkinter.

  Python and Tkinter Programming
     Book by John Grayson (ISBN 1-884777-81-3).

  Tcl/Tk documentation:

  Tk commands
     Most commands are available as "Tkinter" or "Tkinter.ttk"
     classes. Change '8.6' to match the version of your Tcl/Tk
     installation.

  Tcl/Tk recent man pages
     Recent Tcl/Tk manuals on www.tcl.tk.

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

  Tcl and the Tk Toolkit
     Book by John Ousterhout, the inventor of Tcl.

  Practical Programming in Tcl and Tk
     Brent Welch の百科事典のような本です。


24.1.1. Tkinter モジュール
==========================

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

Tk インタフェースモジュールの他にも、 "Tkinter" には Python モジュール
が数多く入っています。最も重要なモジュールは、 "Tkinter" 自体と
"Tkconstants" と呼ばれるモジュールの二つです。前者は自動的に後者を
import するので、以下のように一方のモジュールを import するだけで
Tkinter を使えるようになります:

   import Tkinter

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

   from Tkinter import *

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

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

   バージョン 2.4 で変更: *useTk* パラメタが追加されました.

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

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

   バージョン 2.4 で追加.

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

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

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

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

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

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

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

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

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

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

これらも Python 3 で改名されました。新たな "tkinter" パッケージのサブ
モジュールになったのです。


24.1.2. Tkinter お助け手帳
==========================

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

謝辞:

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

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

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

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

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

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


24.1.2.1. この節の使い方
------------------------

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

When trying to answer questions of the form "how do I do blah", it is
often best to find out how to do "blah" in straight Tk, and then
convert this back into the corresponding "Tkinter" call. Python
programmers can often guess at the correct Python command by looking
at the Tk documentation. This means that in order to use Tkinter, you
will have to know a little bit about Tk. This document can't fulfill
that role, so the best we can do is point you to the best
documentation that exists. Here are some hints:

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

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

* たいていの場合、 "Tkinter.py" は参照先としては最後の地 (last
  resort) ですが、それ以外の手段で調べても分からない場合には救いの地
  (good place) になるかもしれません。


24.1.2.2. 簡単な Hello World プログラム
---------------------------------------

   from Tkinter import *

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

       def createWidgets(self):
           self.QUIT = Button(self)
           self.QUIT["text"] = "QUIT"
           self.QUIT["fg"]   = "red"
           self.QUIT["command"] =  self.quit

           self.QUIT.pack({"side": "left"})

           self.hi_there = Button(self)
           self.hi_there["text"] = "Hello",
           self.hi_there["command"] = self.say_hi

           self.hi_there.pack({"side": "left"})

       def __init__(self, master=None):
           Frame.__init__(self, master)
           self.pack()
           self.createWidgets()

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


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


24.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.py モジュール内にリストされて
います。

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

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

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


24.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" モジュールが import される時点で一度だけ実行されます。(ユ
   ーザがこの過程を目にすることはありません。)

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

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


24.1.6. 簡単なリファレンス
==========================


24.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')}

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


24.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)


24.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'" です。


24.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):
           Frame.__init__(self, 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()


24.1.6.5. ウィンドウマネージャ
------------------------------

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

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

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

   from Tkinter import *
   class App(Frame):
       def __init__(self, master=None):
           Frame.__init__(self, 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()


24.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()" メソッドで
   すが、一引数を取るどんなウィジェットメソッドでもあり得ます。例えば
   、 Python ソース配布の "Demo/tkinter/matt/canvas-with-
   scrollbars.py" ファイルを参照してください。

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


24.1.6.7. バインドとイベント
----------------------------

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

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

ここでは:

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

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

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

例えば:

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

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

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

   Tk      Tkinter Event Field             Tk      Tkinter Event Field
   --      -------------------             --      -------------------
   %f      focus                           %A      char
   %h      height                          %E      send_event
   %k      keycode                         %K      keysym
   %s      state                           %N      keysym_num
   %t      time                            %T      type
   %w      width                           %W      widget
   %x      x                               %X      x_root
   %y      y                               %Y      y_root


24.1.6.8. index パラメータ
--------------------------

たくさんのウィジェットが渡される"index"パラメータを必要とします。これ
らはテキストウィジェットでの特定の場所や、エントリウィジェットでの特定
の文字、あるいは、メニューウィジェットでの特定のメニュー項目を指定する
ために使われます。

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

   AtEnd()
      テキストの最後の位置を参照します

   AtInsert()
      テキストカーソルの位置を参照します

   AtSelFirst()
      選択されたテキストの先頭の位置を指します

   AtSelLast()
      選択されているテキストおよび最終的に選択されたテキストの末尾の位
      置を示します。

   At(x[, y])
      ピクセル位置 *x*, *y* (テキストを一行だけ含むテキストエントリウ
      ィジェットの場合には *y* は使われない)の文字を参照します。

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

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

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

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

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

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

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

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


24.1.6.9. 画像
--------------

Images of different formats can be created through the corresponding
subclass of "Tkinter.Image":

* "BitmapImage" for images in XBM format.

* "PhotoImage" for images in PGM, PPM, GIF and PNG formats. The
  latter is supported starting with Tk 8.6.

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

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

参考: The Pillow package adds support for formats such as BMP, JPEG,
  TIFF, and WebP, among others.


24.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* 引数で使う定数です。
