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 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
Most commands are available as
Tkinter
orTkinter.ttk
classes. Change '8.6' to match the version of your Tcl/Tk installation.- 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 の百科事典のような本です。
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.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 |
オプション名 |
|
1 |
データベース検索用のオプション名 |
|
2 |
データベース検索用のオプションクラス |
|
3 |
デフォルト値 |
|
4 |
現在の値 |
|
例:
>>> 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
:
XBM 形式の画像のための
BitmapImage
。PGM, PPM, GIF, PNG 形式の画像のための
PhotoImage
。 最後のは Tk 8.6 からサポートされるようになりました。
画像のどちらの型でも file
または data
オプションを使って作られます (その上、他のオプションも利用できます)。
image
オプションがウィジェットにサポートされるところならどこでも、画像オブジェクトを使うことができます (例えば、ラベル、ボタン、メニュー)。これらの場合では、Tk は画像への参照を保持しないでしょう。画像オブジェクトへの最後の Python の参照が削除されたときに、画像データも削除されます。そして、どこで画像が使われていようとも、Tk は空の箱を表示します。
参考
Pillow パッケージにより、 BMP, JPEG, TIFF, WebP などの形式のサポートが追加されました。
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)¶ ファイルハンドラの登録を解除します。