25.1. tkinter — Tcl/Tk の Python インタフェース

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


tkinter パッケージ (“Tk インタフェース”) は、Tk GUI ツールキットに対する標準の Python インタフェースです。Tk と tkinter はほとんどの Unix プラットフォームの他、Windows システム上でも利用できます (Tk 自体は Python の一部ではありません。Tk は ActiveState で保守されています)。tkinter が正常にインストールされているかどうかは、コマンドラインから python -m tkinter を実行することで確認できます。これはシンプルな Tk インタフェースのデモンストレーションウィンドウを開きます。

参考

Python Tkinter Resources

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

TKDocs

広範囲に渡るチュートリアルに加え、一部のウェジェットについて説明しています。

Tkinter reference: a GUI for Python

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

Tkinter docs from effbot

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

Tcl/Tk manual

tcl/tk の最新バージョンの公式マニュアルです。

Programming Python

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

Modern Tkinter for Busy Python Developers

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

Python and Tkinter Programming

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

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 は参照先としての最後の手段ですが、それ以外の手段で調べても分からない場合には救いの地になるかもしれません。

参考

Tcl/Tk 8.6 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.2.2. 簡単な Hello World プログラム

import tkinter as tk

class Application(tk.Frame):
    def __init__(self, master=None):
        super().__init__(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=root.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 内のウィジェットは、ファイルシステムにおけるファイルと同様、パス名 を使って名づけられます。トップレベルのウィジェット、すなわち ルート. (ピリオド) という名前になり、その子ウィジェット階層もピリオドで区切ってゆきます。ウィジェットの名前は、例えば .myApp.controlPanel.okButton のようになります。

options

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

例えば:

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

ウィジェットを作成すると、ウィジェットへのパス名は新しいコマンドになります。この新たな widget command は、プログラマが新たに作成したウィジェットに action を実行させる際のハンドルになります。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.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. ウィジェット変数を関連付ける

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

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

Variable には、StringVarIntVarDoubleVar、および 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

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

boolean

整数の 0 または 1 (訳注: 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 ビット: "#RRGGBB"、12 ビット: "#RRRGGGBBB"、あるいは、16 ビット "#RRRRGGGGBBBB" の範囲を取ります。ここでは、R,G,B は適切な 16 進数ならどんなものでも表します。詳細は、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

これは空白で区切られた 4 個の要素をもつ文字列です。各要素は指定可能な距離です (以下を参照)。例えば: "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

は 1 個の引数を取り、イベントが起きるときに呼び出される 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 height %E send_event
%k keycode %K keysym
%s state %N keysym_num
%t time %T

%w width %W widget
%x x %X x_root
%y y %Y y_root

25.1.6.8. index パラメータ

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

エントリウィジェットのインデックス (index, view index, など)

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

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

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

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

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

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

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

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

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

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

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

25.1.6.9. 画像

Bitmap/Pixelmap 画像を tkinter.Image のサブクラスを使って作ることができます:

  • BitmapImage は X11 ビットマップデータに対して使えます。

  • PhotoImage は GIF と PPM/PGM カラービットマップに対して使えます。

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

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

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