bind シーケンス
「bind」メソッドにイベントを設定するには引数 sequence にイベントの文字列を指定します。この文字列の指定には 3 つの形式がああります。
一つ目は ASCII(アスキー)文字を直接指定する方法です。この指定はキーボードの一つの文字キーを押下したときのイベントに対応します。最も簡単な指定方法ですが、スペースキーおよび「<」キーの指定はできません。この形式のパターンは、二つ目の形式の KeyPress タイプでキーを指定したのと同じになります。
二つ目はイベントの文字列を「< >」で囲んだ形式です。最も一般的な方法で、スペースキーおよび「<」キーの指定ができるとともに、複合キー操作の指定をすることができます。また、マウス操作のイベントを指定することができます。
三つ目はイベントの文字列を「<< >>」で囲んだ形式です。これはユーザー定義の仮想イベントを指定するために使用します。
1. ASCII形式
ASCII形式によるキー押下のイベントの指定は文字を記述するだけの簡単な方法です。例えば、キー「A」の押下のイベントは単に下記のように「'a'」と記述するだけです。
は「A」キーを押下したときに関数「func」が実行されます。
大文字の「A」はシフトキーを押しながら「A」キーを押すか、「Caps Lock」のときに「A」を押下したときですが、
と記述します。
数値や記号を含むタイピング文字のイベントはそのまま記述することができますが、スペースおよび「<」は指定できません。また、ASCII文字でも制御文字は指定することができません(例えば、「Esc」、「Tab」、「Shift」、「Ctr」、「Back Space」、「Delete」、「Alt」など)。
2. 「< >」形式
イベントを「< >」で囲んだの文字列で下記の書式で表記します。。
ここで、「type」は基本的なイベントの表記で、「modifier」は「type」イベントの拡張に、「detail」はより詳細な指定に使用されます。通常下の半角空白による表記より上の「-」による表記が用いられます。「type」と「detail」のいずれか一つにイベントが指定されている場合、他の項目は省略することができます。
・type
基本イベントは、マウスおよびキーの操作や OS のオブジェクトに対するイベントで下記のイベント名の文字列で定義されています。
イベント名(type) | コード | イベント |
Key | 2 | キーボードのキーが押された。 |
KeyPress | 2 | 「Key」と同じ。 |
KeyRelease | 3 | キーボードのキーが押されて離された。 |
Button | 4 | マウスボタン(左右またはホイールボタン)が押された。 |
ButtonPress | 4 | 「Button」と同じ。 |
ButtonRelease | 5 | マウスボタン(左右またはホイールボタン)が押されて離された。 |
Motion | 6 | マウスポインタが移動した。 |
Enter | 7 | マウスポインタがオブジェクト上に入った。 |
Leave | 8 | マウスポインタがオブジェクト上から出た。 |
FocusIn | 9 | フォーカスがオブジェクトに設定された。 |
FocusOut | 10 | フォーカスがオブジェクトから離れた。 |
Expose | 12 | ウィンドウの全部または一部の再描画が要求された。 |
Visibility | 15 | オブジェクトが非表示から表示状態になった。 |
Destroy | 17 | オブジェクトが破棄された。 |
Unmap | 18 | オブジェクトの配置が解除された。 |
Map | 19 | オブジェクトが配置された。 |
Configure | 22 | オブジェクトのサイズ、表示位置、境界線やハイライト枠の幅が変更された。 |
Colormap | 32 | オブジェクトに関連付けられたカラーマップが変更、インストール、またはアンインストールされた。 |
MouseWheel | 38 | マウスホイールが操作された。 |
tkinter では上記より多くのイベント文字列が定義されていますが、内部処理用に定義されているものがあり、動作しないか、エラーになります。また、OS の環境によって動作しないものもあり、筆者の環境で使用できないものは、上記の表から除いています。
上記の表で、イベント名の横のコードはイベントハンドラ(コールバック関数)に渡されるイベントオブジェクトの「type」属性に格納される番号です。イベントを識別するのに用いられます。イベントオブジェクトを参照して下さい。
・detail
マウスやキーの操作における「type」での基本イベントの指定は、単にマウスボタンのクリックやキーのクリックだけで、個別のボタンやキーを判別しません。特定のボタンやキーは「detail」で指定します。
「type」が「KeyPress」や「KeyRelease」のキー操作のイベントの場合、キーの指定は基本的にはキーに割り振られた名前です。但し、アルファベットの小文字と大文字は同じキーですが異なったキーとして区別されることに注意します。通常は小文字として判別されますが、「Shift」キーを押している場合や「Caps Lock」状態では大文字として判別されます。「G」キーを押下した場合のイベントは小文字の場合は下記の上段、大文字の場合は下段のように記述します。
キー操作におけるキーの指定は下の表のキー名を「detail」に記述します。キー名の「( )」(カッコ)内の文字は同じキー指定として用いることができます。
キー名(detail) (keysym) |
コード(keycode) | 番号(keysym_num) | キー表記 |
BackSpace | 8 | 65288 | BackSpace |
Tab | 9 | 65289 | Tab |
Tab | 9 | 65289 | Tab(テンキー) |
Return | 13 | 65293 | Enter |
Return | 13 | 65293 | Enter(テンキー) |
Shift_L | 16 | 65505 | Shift(左配置) |
Shift_R | 16 | 65506 | Shift(右配置) |
Control_L | 17 | 65507 | Ctrl(左配置) |
Control_R | 17 | 65508 | Ctrl(右配置) |
Alt_L | 18 | 65513 | Alt(左配置) |
Pause | 19 | 65299 | Pause |
Escape | 27 | 65307 | Esc |
Prior | 33 | 65365 | PgUp |
Next | 34 | 65366 | PgDn |
End | 35 | 65367 | End |
Home | 36 | 65360 | Home |
Left | 37 | 65361 | ← |
Up | 38 | 65362 | ↑ |
Right | 39 | 65363 | → |
Down | 40 | 65364 | ↓ |
Insert | 45 | 65379 | Insert |
Delete | 46 | 65535 | Delete |
0 ~ 9 | 48 ~ 57 | 48 ~ 57 | 0 ~ 9 |
exclam( ! ) | 49 | 33 | !(Shift 押下時) |
quotedbl( " ) | 50 | 34 | "(Shift 押下時) |
numbersign( # ) | 51 | 35 | #(Shift 押下時) |
dollar( $ ) | 52 | 36 | $(Shift 押下時) |
percent( % ) | 53 | 37 | %(Shift 押下時) |
ampersand( & ) | 54 | 38 | &(Shift 押下時) |
apostrophe( ' ) | 55 | 39 | '(Shift 押下時) |
parenleft( ( ) | 56 | 40 | ((Shift 押下時) |
parenright( ) ) | 57 | 41 | )(Shift 押下時) |
A ~ Z | 65 ~ 90 | 65 ~ 90 | A ~ Z(Shift または CapsLock で大文字設定時) |
a ~ z | 65 ~ 90 | 97 ~ 122 | A ~ Z |
Win_L | 91 | 65371 | ウィンドウマーク(左配置) |
App | 93 | 65373 | アプリケーションマーク |
0 ~ 9 | 96 ~ 105 | 48 ~ 57 | 0 ~ 9(テンキー) |
asterisk( * ) | 106 | 42 | *(テンキー) |
plus( + ) | 107 | 43 | +(テンキー) |
minus( - ) | 109 | 45 | -(テンキー) |
period( . ) | 110 | 46 | .(テンキー) |
slash( / ) | 111 | 47 | /(テンキー) |
F1 ~ F12 | 112 ~ 123 | 65470 ~ 65481 | F1 ~ F12 |
asterisk( * ) | 186 | 42 | *(Shift 押下時) |
colon( : ) | 186 | 58 | : |
plus( + ) | 187 | 43 | +(Shift 押下時) |
semicolon( ; ) | 187 | 59 | ; |
comma( , ) | 188 | 44 | , |
less( < ) | 188 | 60 | <(Shift 押下時) |
minus | 189 | 45 | - |
equal( = ) | 189 | 61 | =(Shift 押下時) |
period( . ) | 190 | 46 | . |
greater( > ) | 190 | 62 | >(Shift 押下時) |
slash( / ) | 191 | 47 | / |
question( ? ) | 191 | 63 | ?(Shift 押下時) |
at( @ ) | 192 | 64 | @ |
grave( ` ) | 192 | 96 | `(Shift 押下時) |
bracketleft( [ ) | 219 | 91 | [ |
braceleft( { ) | 219 | 123 | {(Shift 押下時) |
backslash( ¥ ) | 220 | 92 | ¥ |
bar( | ) | 220 | 124 | |(Shift 押下時) |
bracketright( ] ) | 221 | 93 | ] |
braceright( } ) | 221 | 125 | }(Shift 押下時) |
asciicircum( ^ ) | 222 | 94 | ^ |
asciitilde( ~ ) | 222 | 126 | ~(Shift 押下時) |
backslash( \ ) | 226 | 92 | \ |
underscore( _ ) | 226 | 95 | _(Shift 押下時) |
上記の表で、キー名の「keysym」、コードの「keycode」、番号の「keysym_num」はイベントハンドラ(コールバック関数)に渡されるイベントオブジェクトの属性で、それぞれに格納される値です。キー操作のイベントを識別するのに用いられます。ここで、キー名の「( )」(カッコ)内の文字は渡されまん。イベントオブジェクトを参照して下さい。
キー操作の記述で「type」を省略することができます。このとき、「type」は「KeyPress」として解釈されます。ただし、数字の「1」から「5」は、別の意味に用いられているので「type」を省略することができません。また、「<」および「>」は単独で表記することができません。
「type」が「Button」や「ButtonRelease」のマウス操作のイベントの場合、マウスボタンの指定は下の表の番号を「detail」に記述します。
イベント名(type) | 番号(num) | イベント |
Button ButtonRelease | 1 | マウス左ボタン |
Button ButtonRelease | 2 | マウス中ボタン |
Button ButtonRelease | 3 | マウス右ボタン |
上記の表で、番号の「num」はイベントハンドラ(コールバック関数)に渡されるイベントオブジェクトの「num」属性に格納されます。マウス操作のボタンを識別するのに用いられます。イベントオブジェクトを参照して下さい。
マウス操作の記述で「type」を省略して「detail」に番号のみを記述することができます。このとき、「type」は「Button」として解釈されます。
番号「4」と「5」は Linux でのマウスホイール操作で、Windows では使用しません。
・modifier
マウスやキーの操作における「type-detail」でのイベント指定は、キー操作におけける特定のキーを指定する「Shift」操作を除いて、複合的な操作によるイベントを指定できません。例えば、「Ctrl」キーを押しながら「c」キーを押した場合のイベントなどです。このような複合的操作のイベントは「modifier」を用いて指定します。
複合的な操作の指定は下の表のイベント名を「modifier」に記述します。
イベント名(modifier) | イベント |
Alt | 「Alt」キーが押されている。 |
Button1 | マウスの左ボタンが押されている。 |
Button2 | マウスの中ボタンが押されている。 |
Button3 | マウスの右ボタンが押されている。 |
Control | 「Ctrl」キーが押されている。 |
Double | 「type-detail」で指定したイベントが2回連続して発生。 |
Extended | 拡張キーボードのキーが押された。キーボード種類に依存するため使用は推奨されません。 |
Lock | 「Caps Lock」が設定されている。 |
Quadruple | 「type-detail」で指定したイベントが4回連続して発生。 |
Shift | 「Shift」キーが押されている。 |
Triple | 「type-detail」で指定したイベントが3回連続して発生。 |
複数個の複合操作を指定することができます。「modifie」イベント名を「-」でつないで「modifier-modifier」としてイベント指定します。例えば、「Alt」キーと「Control」キーを押しながらスペースキーが押されるイベントは「Alt-Control-KyePress-spase」と記述します。
・連続イベント
同じか異なったイベントを連続して実行した場合のイベントを指定することができます。イベントを実行順に並べて記述します。例えば、「a」キーを押した次に「b」キーを押したイベントは「<KeyPress-a><KeyPress-b>」と記述します。このイベントは「a」キーを押した後に「b」以外のキーが押されると解除されます。
同じ操作を複数回連続した場合の指定に「modifier」におけるイベント名「Double」、「Triple」、「Quadruple」の指定があります。「<Double-KeyPress-a>」は「a」キーを2回連続して押下した場合を指しますが、「<KeyPress-a><KeyPress-a>」と類似しています。この二つの記述の違いはイベントのタイミングにあります。「Double」を用いた記述はキーの押下が短い間(通常のダブルクリック程度の時間)に実行されなければ無効になります。後者の記述は時間に関係なくイベントが発生します。
マウスボタン操作では「Button」または「ButtonPress」の場合に注意が必要です。このイベントとキー押下のイベントの場合はマウスボタンを押した状態でないと動作しません。「<Button-1><KeyPress-a>」はマウスの左ボタンを押した状態で「a」キーを押したときにイベントが発生します。これは、マウスのボタンを離すと「ButtonRelease」イベントが発生して、先のイベント指定が解除されるためです。
マウスでの連続操作の場合は上の事象は発生しません。「<Button-1><Button-3>」はマウスの左ボタンをクリックして次に右ボタンをクリックしたときのイベントになります。
3. 「<< >>」形式(仮想イベント)
イベントは通常、システム(OS)が発生します。これを「物理イベント」とも言います。アプリケーションではこれらの「物理イベント」とは別に独自のイベントを発生させることができます。「物理イベント」に対して「仮想イベント」といいます。
仮想イベントの形式は、仮想イベントの名前を「<< >>」で囲んだの文字列で下記の書式で表記します。
ここで、「name」は仮想イベントの名前です。 「Shift」 や 「Control」 などの「modifier」を仮想イベントと組み合わせて変更することはできません。
Tcl/Tk ではウイジェットの操作のために幾つかの仮想イベントが定義されています。特に、エントリウィジェットやテキストウィジェットには編集のためのキーおよびマウス操作に関する多くの仮想イベントが定義されています。下記に Tcl/Tk で定義されている(tkinter で使用できる)仮想イベントを示します。
イベント名(name) | イベント |
ContextMenu | 「マウスの右」ボタン コンテキストメニューの実装時に使用。 |
Copy | 「Ctrl-c」キー 選択されているウィジェットの内容をクリップボードにコピー。 |
Cut | 「Ctrl-x」キー 選択されているウィジェットの内容を削除してクリップボードにコピー。 |
LineEnd | 「End」キー 選択されているウィジェットの内容を選択解除して、行末にカーソルを移動。 |
LineStart | 「Home」キー 選択されているウィジェットの内容を選択解除して、行頭にカーソルを移動。 |
NextChar | 「→」キー 選択されているウィジェットの内容を選択解除して、現在のカーソルの次の文字にカーソルを移動。 |
NextLine | 「↓」キー。 選択されているウィジェットの内容を選択解除して、現在のカーソルの次の行にカーソルを移動。 |
NextPara | 「Ctrl-↓」キー 選択されているウィジェットの内容を選択解除して、現在のカーソルの次の段落(空白行で区切られた行のグループ)の先頭にカーソルを移動。 |
NextWindow | 「Ctrl-Tab」キー 次のオブジェクトにフォーカスを移動。 |
NextWord | 「Ctrl-→」キー 選択されているウィジェットの内容を選択解除して、現在のカーソルの次の単語(空白で区切られた文字列のグループ)の先頭にカーソルを移動。 |
Paste | 「Ctrl-v」キー 選択されているウィジェットの内容をクリップボードの内容に置き換え。 |
PasteSelection | 「マウスの中」ボタン 選択されているウィジェットの内容をマウスカーソルの位置にコピーして挿入。 |
PrevChar | 「←」キー 選選択されているウィジェットの内容を選択解除して、現在のカーソルの前の文字にカーソルを移動。 |
PrevLine | 「↑」キー 選択されているウィジェットの内容を選択解除して、現在のカーソルの前の行にカーソルを移動。 |
PrevPara | 「Ctrl-↑」キー。 選択されているウィジェットの内容を選択解除して、現在のカーソルの段落の先頭にカーソルを移動。段落の先頭にカーソルがある場合は、前の段落(空白行で区切られた行のグループ)の先頭にカーソルを移動。 |
PrevWindow | 「Ctrl-Shift-Tab」キー。 前のオブジェクトにフォーカスを移動。 Windows では「Shift-Tab」でもこの仮想イベントを検出。この場合、フォーカスの移動はない。 |
PrevWord | 「Ctrl-←」キー 選択されているウィジェットの内容を選択解除して、現在のカーソルの単語(空白で区切られた文字列のグループ)の先頭にカーソルを移動。 |
Redo | 「Ctrl-y」キー 「Undo」により取り消した操作を再度実行。 |
SelectAll | 「Ctrl-/」または「Ctrl-a」キー ウィジェットの内容を全て選択。 |
SelectLineEnd | 「Shift-End」キー 選択されているウィジェットの内容の範囲を拡張しながら、行末にカーソルを移動。 |
SelectLineStart | 「Shift-Home」キー 選択されているウィジェットの内容の範囲を拡張しながら、行頭にカーソルを移動。 |
SelectNextChar | 「Shift-→」キー 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの次の文字にカーソルを移動。 |
SelectNextLine | 「Shift-↓」キー 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの次の行にカーソルを移動。 |
SelectNextPara | 「Ctrl-Shift-↓」キー 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの次の段落(空白行で区切られた行のグループ)の先頭にカーソルを移動。 |
SelectNextWord | 「Ctrl-→」キー 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの次の単語(空白で区切られた文字列のグループ)の先頭にカーソルを移動。 |
SelectNone | 「Ctrl-\」キー 選択されているウィジェットの内容を選択解除。 |
SelectPrevChar | 「Shift-←」キー 選選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの前の文字にカーソルを移動。 |
SelectPrevLine | 「Shift-↑」キー 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの前の行にカーソルを移動。 |
SelectPrevPara | 「Ctrl-Shift-↑」キー。 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの段落の先頭にカーソルを移動。段落の先頭にカーソルがある場合は、前の段落(空白行で区切られた行のグループ)の先頭にカーソルを移動。 |
SelectPrevWord | 「Ctrl-Shift-←」キー 選択されているウィジェットの内容の範囲を拡張しながら、現在のカーソルの単語(空白で区切られた文字列のグループ)の先頭にカーソルを移動。 |
ToggleSelection | 「Ctrl」キー + 「マウスの左」ボタン 選択されているウィジェットの内容を選択したまま、マウスの左クリックの位置にカーソルを移動。 複数項目の選択が可能なリストなどの場合に、移動先のカーソル位置の項目も選択される。 |
Undo | 「Ctrl-z」キー 最後の操作を取り消して元に戻します。 |
アプリケーションで物理イベントに関連づけて仮想イベントを定義することができます。Misc クラスの「event_add」メソッドを用います。
ここで、引数「virtual」は新たに定義する仮想イベントの名前で<<name>>の形式で指定します。引数「*sequences」に関連づける物理イベントを指定します。詳細はMisc クラスを参照して下さい。
アプリケーションで任意の名前の仮想イベントを作成して、イベントを発生させることができます。。Misc クラスの「event_generate」メソッドを用います。
ここで、引数「sequence」はアプリケーションで新たに作成して発生させる仮想イベントの名前で<<name>>の形式で指定します。引数「**kw」にイベントオブジェクトに格納する属性値を指定します。詳細はMisc クラスを参照して下さい。