キャンバス

キャンバスはグラフィックを配置するパネルです。

canvas コマンドでキャンバスウィジットを作ってから、 ウィジットコマンド pathName create type ... を実行すればグラフィックを画面上に配置することができます。 やってみるととても簡単です。

    1 : set FONT {{MS Pゴシック} 10 normal}
    2 : canvas .c
    3 : pack .c -fill both -expand 1
    4 : wm geometry . 300x200
    5 : 
    6 : .c create line 10 10 100 50 -fill blue
    7 : .c create line 10 50 100 30 -fill red -dash .
    8 : .c create oval 120 10 220 70 -outline #008000 -fill #CCCCFF
    9 : .c create rectangle 10 80 100 150 -outline green
   10 : .c create text 130 90 -fill magenta -text 文字列 -font $FONT
   11 : .c create arc 120 120 200 190 -outline black -fill white -start 30 -extent 120
   12 : .c create bitmap 260 30 -bitmap questhead
   13 : .c create polygon  230 80 280 85 270 90 290 110 -outline black -fill #CCCC33
   14 : 
   15 : image create photo appsheet16 -data {
   16 :    R0lGODlhEAAQAIIAAPwCBAQCBAT+/Pz+/KSipPz+BAAAAAAAACH5BAEAAAAA
   17 :    LAAAAAAQABAAAANFCBDc7iqIKUW98WkWpx1DAIphR41ouWya+YVpoBAaCKtM
   18 :    oRfsyue8WGC3YxBii5+RtiEWmASFdDVs6GRTKfCa7UK6AH8CACH+aENyZWF0
   19 :    ZWQgYnkgQk1QVG9HSUYgUHJvIHZlcnNpb24gMi41DQqpIERldmVsQ29yIDE5
   20 :    OTcsMTk5OC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCmh0dHA6Ly93d3cuZGV2
   21 :    ZWxjb3IuY29tADs=
   22 : }
   23 : .c create image 240 140 -image appsheet16
   24 : 
   25 : button .b -text ボタン -font $FONT
   26 : .c create window 240 175 -window .b

実行すると次のようになります。

image/chapter_231_001.png

2 行目でキャンバスウィジットを作って、 6 行目以降でグラフィックを描画しています。

pathName create type ... がそのコマンドですが、 type に line を指定すると直線の描画となります (6 行目と 7 行目)。 数値は、始点と終点の X Y 座標です。 線の色は -fill オプションで指定します (-outline オプションではないのがちょっと意外ですが)。 オプション -dash は破線にするかどうかの指定です。 ここでは「-dash .」として「点線」を指定しましたが、 線を描画する部分と空きの部分の長さを陽に指定する方法もあります。

type に oval を指定すると楕円になります(8 行目)。 指定する X Y 座標は楕円を囲む長方形の領域の左上と右下の座標です。 オプション -outline で境界線の色を、 オプション -fill で塗りつぶしの色を指定します。

type に rectangle を指定すると長方形になります(9 行目)。 指定する X Y 座標は長方形の左上と右下の座標です。 ここではオプション -fill を指定していないので、 内部は塗りつぶされません。

type に text を指定すると文字列を描画できます(10 行目)。 文字の色は -fill オプションで指定します。

type に arc を指定すると扇型(楕円の一部)となります(11 行目)。 オプション -start で開始位置の角度(単位は度)、 オプション -extent で広がりの角度を指定します。

type に bitmap を指定すると Tcl/Tk 備え付けのビットマップイメージを描画できます(12 行目)。

type に polygon を指定すると多角形を描画できます(13 行目)。 このときは、頂点の X Y 座標を複数個指定します。

type に image を指定するとイメージを描画できます(15 〜 23 行目)。 上記例のイメージは ICONS のアイコンイメージを利用してみました。

type に window を指定するとウィジットを描画できます(25 〜 26 行目)。 オプション -window で配置したいウィジット(あらかじめ作成しておきます) を指定します。


今度は一旦描画したグラフィックを変更してみます。 実は pathName create type ... を実行したときの返り値が、 配置したグラフィックスの ID になっています。 Tcl/Tk のコンソールから操作していれば、 コマンドを実行したときに 1、 2、 3、... と番号が返されるのがわかります。 プログラムとして処理するのであれば、 このコマンドの返り値を変数に保持しておけば後から操作できるようになります。

上記の例の実行後、 3 番目に作成した楕円を下方向に 30 ピクセル移動してみましょう。 そのためには次のコマンドを実行します。

.c move 3 0 30

「3」が操作対象のグラフィックの ID を示し、 「0 30」が X 方向に 0、Y 方向に 30 移動することを示しています。 結果は次の通りです。

image/chapter_231_002.png

楕円が下方向に移動しました。 また、「文字列」というテキストと重なっていますが、 テキストの方が手前で楕円の方が下になっています。 この重なり具合はグラフィックアイテムを「作った順」で決まります。 つまり、後から作った方が手前に表示されることになります。 なお、この順序はキャンバスのウィジットコマンドで変更できます。


最後はイベントバインドを用いて、 簡単なお絵書きソフトを作ってみます (イベントバインドの詳細については イベント処理 を参照してください)。 下記の例では、描ける図形は長方形のみです。 枠線の色、塗りつぶしの色も固定ですが、 これだけの記述で、 マウスドラッグで長方形を描くプログラムができあがります。

    1 : canvas .c -background white   ; # 背景を白のキャンバスにする
    2 : pack .c -fill both -expand 1  ; # 配置。ウィンドウサイズに追従するように
    3 : wm geometry . 300x200         ; # 画面サイズを少し小さめに設定
    4 : 
    5 : # 以下、グローバル変数
    6 : set mousePressed 0 ; # マウスボタンが押されているとき 1
    7 : set itemID         ; # 描いた長方形の ID 保持用
    8 : set startX 0       ; # 描画開始位置の X 座標
    9 : set startY 0       ; # 描画開始位置の Y 座標
   10 : set itemList {}    ; # 描画が決定した長方形の ID を保持するリスト
   11 : 
   12 : # マウスボタンが押されたときの処理。
   13 : # w : キャンバスウィジットのパス。x y : そのときのマウスの座標
   14 : proc mousePress {w x y} {
   15 :   global mousePressed itemID startX startY
   16 :   set mousePressed 1
   17 :   set startX $x
   18 :   set startY $y
   19 :   set itemID [$w create rectangle $startX $startY $x $y -outline #999999]
   20 : }
   21 : 
   22 : # マウスが移動したときの処理。マウスボタン押下であるときのみ意味がある。
   23 : # w : キャンバスウィジットのパス。x y : そのときのマウスの座標
   24 : proc mouseDrag {w x y} {
   25 :   global mousePressed itemID startX startY
   26 :   if {$mousePressed == 1} {
   27 :     $w coords $itemID $startX $startY $x $y
   28 :   }
   29 : }
   30 : 
   31 : # マウスボタンを離したときの処理。
   32 : # w : キャンバスウィジットのパス。x y : そのときのマウスの座標
   33 : proc mouseRelease {w x y} {
   34 :   global mousePressed itemID startX startY itemList
   35 :   set mousePressed 0
   36 :   $w coords $itemID $startX $startY $x $y
   37 :   $w itemconfigure $itemID -outline black -fill #9999FF
   38 :   lappend itemList $itemID
   39 :   puts $itemList
   40 : }
   41 : 
   42 : bind .c <ButtonPress-1> {mousePress .c %x %y}
   43 : bind .c <Motion> {mouseDrag .c %x %y}
   44 : bind .c <ButtonRelease-1> {mouseRelease .c %x %y}

適当にマウスを押してからドラッグすると長方形を描けますので、 いくつか描いてみた状態が次です(ドラッグ途中のスクリーンダンプです)。

image/chapter_231_003.png

描いている途中の長方形は、 枠線が薄く表示されるようにしてあります。

上記の例をきちんと解説しておきます。

まず、1 〜 3 行目はコメントの通り、キャンバスウィジットの配置ですが、 図形描画用ということで、背景を白にしました。 6 〜 10 行目はグローバル変数の初期設定です。 変数 mousePressed はマウスボタンが押されたとき(ドラッグ開始時点) に 1 に設定され、 マウスボタンが離されたとき(ドラッグ終了時点)に 0 に設定されます。 変数 itemID は描いた長方形の ID を保持します。 変数 startX と startY は描画開始時点(つまりドラッグ開始時点) でのマウスポインタの座標を保持します。 変数 itemList は最終的に描かれた長方形の ID を保持するリストです。 これは無くてもよいのですが、描画と同時にコンソール上に表示して、 確かに長方形の ID が生成されたことを確認するために使っています。

14 〜 20 行目はマウスボタンを押したときの処理を定義しているプロシージャです。 引数はウィジットのパス、X 座標、Y 座標です。 15 行目で使用するグローバル変数を宣言し、 16 〜 18 行目でマウスが押されたという状態と、 そのときの座標を保存しておきます。 19 行目で長方形の描画を行ない、 その ID をグローバル変数 itemID に保存します。 このときの長方形は、ドラッグ開始時点なので、 まだ未確定の長方形とみなし、 枠線を灰色で表示するようにします。

24 〜 29 行目がマウスポインタが移動中の処理を定義するプロシージャです。 引数はやはりウィジットのパス、X 座標、Y 座標です。 25 行目で使用するグローバル変数を宣言しますが、 以降の処理は「マウスボタンが押されているときのみ実施する」ので、 変数 mousePressed の値が 1 のときのみ実施するように if コマンドを使います。 このときの処理は、描いている途中の長方形のサイズを変更することです。 したがって、27 行目に書かれている通り、 変数 itemID が保持している ID の図形、 つまり描画途中の長方形の座標を変更します。 pathName coords id ... というウィジットコマンドは、 グラフィックアイテムの座標を変更するコマンドです。 枠線の色などは指定していないので、 マウスドラッグに合わせて枠線が灰色の長方形が追従するように見えます。

33 〜 40 行目がマウスボタンを離したときの処理を定義しているプロシージャです。 引数はやはりウィジットのパス、X 座標、Y 座標です。 34 行目で使用するグローバル変数を宣言し、 35 行目でマウスが離されたという状態を保存します。 36 行目で長方形の座標を現在のマウスの位置に合わせ、 37 行目で枠線の色を黒にし、かつ内部を塗りつぶします。 そして、デバッグ用にその ID をリストに保持し、 リストを表示します(38 〜 39 行目)。

42 〜 44 行目はイベントバインドで、 上記のプロシージャをそれぞれマウスのボタン1が押されたとき、 マウスが移動するとき、マウスのボタン1が離されたとき、 に関連付けます。 bind コマンド記述中の %x と %y は現在のマウスポインタの座標を示すので、 プロシージャにマウスポインタの現在位置が渡されることになり、 これで所望の動作のできあがりとなります。

canvas コマンド

ここで canvas コマンドの形式を示します。

コマンド書式 canvas pathName ?options?
説明 第1引数にはキャンバスウィジットとして使われるパス名を指定する。options の部分にはいくつかのウィジット標準オプションと、canvas コマンド特有のオプションを指定できる。どのようなオプションがあるかについては以下で解説する。

つまり、canvas に続けてドット区切りのウィジット名、オプション、 というように記述します。

canvas コマンド特有のオプション

canvas コマンド特有のオプションには以下のものがあります。

-closeenough value
マウスポインタがどの程度描画されたアイテムに近ければ そのアイテム内にあるとみなすか、という数値を実数で指定します。 デフォルト値は 1.0 です。
-confine boolean
後述のオプション -scrollregion の指定範囲を越えて キャンバスの表示を許可するかどうかをブーリアン値で指定します。 true は「許可しない」ことを示します(これがデフォルトです。 「confine」という単語の意味が「制限する」ですので、 true のときに制限、つまり表示を許可しない、という意味になります)。
-height value
高さを指定します。
-scrollregion list
4つの数値からなるリストを引数として与えることで、 スクロール可能な範囲を指定します。 例えば、「canvas .c -scrollregion {0 0 400 300}」 とすると、 (0, 0) から (400, 300) の範囲がスクロール可能な領域となります。 最初の2つの数値に負の値を指定することで、 上または左方向のスクロール可能な領域を広げることができます。 このオプションを指定しないと、 スクロール可能なキャンバスにはなりません。
-width value
幅を指定します。
-xscrollincrement value
水平方向のスクロール単位を指定します。 例えば 10 を指定すると、 スクロールバーを掴んでスクロールしようとしたとき、 10 ピクセル単位でスクロールするようになります。
-yscrollincrement value
垂直方向のスクロール単位を指定します。

標準オプション

canvas コマンドに対して使える標準オプションには以下のものがあります。 「ウィジット標準オプション」 にて解説してありますので、そちらを参照してください。

キャンバスについての解説

キャンバスウィジットについて何点か解説しておきます。

まず、キャンバスは、そこに配置されたグラフィックをすべて 「グラフィックアイテム」として ID 付きで管理しています。 描いた後にピクセルデータになってしまうわけではないので、 その ID を指定することで、移動やサイズ変更、削除などを行なえます。 しかもその場合、自動的にグラフィックアイテムは再描画されます。 各グラフィックアイテムに対してイベントを関連付けることも可能です。 この ID は実際には 1、 2、 3、... のように順に数値が付けられる形になります。 また、一旦使われた数値は、そのキャンバスではもう使われませんし、 一旦割り当てられた ID を変えることもできません。

キャンバスはグラフィックアイテムを「ID のリスト」で管理しており (ディスプレイリスト)、 そのリストの順序で画面に描きます。 したがって、リスト中で後の方のグラフィックアイテムは、 それより前のものと重なる場合、後の方が上に重ねられる形で描画されます。 この順序はウィジットコマンドで変更できます。

また、テキストウィジットと同様に、 グラフィックアイテムに対して「タグ」を付けることができます。 同じタグを付けたグラフィックアイテムは、 ID ではなくタグを指定することで一括して同じ処理を施すことが可能です。 タグに使える文字列は、ID と区別するために、 単なる「数値」にすることはできません。 一般の言語のいわゆる「識別子」のように、 アルファベットで始まる名称にしておくのがよいと思います。

タグにはデフォルトで「all」というものが存在します。 これは全グラフィックアイテムに対して暗黙的に付けられるので、 例えば「.c move all 20 10」とすれば、 全グラフィックアイテムが X 方向に 20、 Y 方向に 10 移動します。 また、「current」というタグも暗黙のうちに存在します。 これはマウスカーソルがある部分のグラフィックアイテムです。

キャンバスウィジットやグラフィックアイテムに対して座標を指定するとき、 その数値は「実数値」です。 単位は何も指定しなければピクセルですが、 c を付ければセンチメートル単位で、 m を付ければミリメートル単位で、 i を付ければインチ単位で、 p を付ければポイント単位(1/72 インチのこと)になります。 なお、座標は通常はキャンバスの左上を原点として、 右に進むほど X の値が増え、下に進むほど Y の値が増えます。

テキストアイテムや折れ線、ポリゴンは「インデックス」の概念を持ちます。 つまり、 アイテム中の文字の位置や座標の位置を指定する方法を持っているということです。 そのような位置/座標の指定場所には、次の表現を使えます。

数値
テキストアイテムに対しては、0 は先頭の文字、1 はその次の文字、を示します (以下、数値が増えた場合は同様に次の文字を指します)。 折れ線やポリゴンの場合、座標値は X,Y のペアで扱いますので、 このインデックス値が奇数のときは自動的に 1 を引いて扱います (つまり、3 を指定したら 2 番目から始まるペアを指定したとみなす)。 0 よりも小さい値は 0 として扱われ、 テキストの場合は文字列長以上の数値の場合は文字列長として扱われます。
end
文字列または座標リストの末尾の次を表します。
insert
挿入カーソルの位置を示します。 この指定方法は折れ線やポリゴンには用意されていません。
sel.first
セレクトされた文字列の最初の文字を示します。
sel.last
セレクトされた文字列の最後の文字を示します。
@ x,y
指定された x, y 座標の位置を示します。 もしこの座標が文字列の領域外にある場合は、 当該文字列の先頭または末尾のどちらか、 指定座標に近い方が選ばれます。

枠線を持つグラフィックアイテムに対しては点線、 破線の表現を用いることができます。 これを指定するオプションは -dash ですが、 値の指定方法として2通りあります。 1つは線を描く部分の長さと描かない部分の長さを指定する方法です。 例えば -dash {2 4} とすれば 2 ピクセル描いて 4 ピクセル描かない、 という描画を繰り返します (ただし、私の環境ではいろいろな指定をすると破線にはなるのですが、 必ずしも数値指定がうまく反映されないようです)。 もう1つは規定の指定を利用する方法です。 規定の指定には値として「.,-_ 」の5種類の文字 (ピリオド、カンマ、ハイフン、アンダースコア、空白)を使います。 ピリオドとカンマは 2 ピクセル分、 ハイフンとアンダースコアは 6 ピクセル分、 空白は 4 ピクセル分の空き、です。 したがって「-dash -.」とすれば一点鎖線、「-dash -..」とすれば二点鎖線、 などとなります。

ウィジットのコマンド

キャンバスウィジットを 「canvas pathName ?options?」 として生成した後は、 pathName をコマンドとして使えます。 この場合のコマンドは次の形式になります。

コマンド書式 pathName option ?arg arg ...?
説明 キャンバスウィジットのウィジットコマンド。オプションについては以下で解説する。

以下の表記において、tagOrId の部分には、 グラフィックアイテムの ID またはタグのいずれでも使用できます。

pathName addtag tag above tagOrId
tagOrId が示すグラフィックアイテムの次のアイテムに tag で示されるタグを付けます。 tagOrId が複数のアイテムを示す場合は、 ディスプレイリスト上、最後のものが使われます。
pathName addtag tag all
キャンバス上のすべてのグラフィックアイテムに対して tag で示されるタグを付けます。
pathName addtag tag below tagOrId
tagOrId が示すグラフィックアイテムの前のアイテムに tag で示されるタグを付けます。 tagOrId が複数のアイテムを示す場合は、 ディスプレイリスト上、最初のものが使われます。
pathName addtag tag closest x y ?halo? ?start?
x y 座標で示される位置に最も近いグラフィックアイテムに対して tag で示されるタグを付けます。 該当するアイテムが複数ある場合には、 ディスプレイリスト上、最後のものに対して指定したタグが設定されます。 halo が指定された場合(非負の数値のみ指定可能)は、 それは x y からの同心円上の距離を示しており、 その円内のものについて、 ディスプレイリスト上、最後のものに対して指定したタグが設定されます。 さらに start が指定された場合は、 それは ID またはタグを指定しているものとみなされ、 ディスプレイリスト上、start より前のアイテムのみが考慮対象となります。
pathName addtag tag enclosed x1 y1 x2 y2
x1 y1 x2 y2 を座標とする長方形内部に完全に含まれるアイテムに対して tag で示されるタグを付けます。 この長方形領域とアイテムの境界の座標が丁度同じ場合は、 タグ付けの対象になりません(つまり、完全に内側になければ対象になりません)。 x1x2 以下、y1y2 以下の数値でなければなりません。
pathName addtag tag overlapping x1 y1 x2 y2
x1 y1 x2 y2 を座標とする長方形領域に少しでも重なるアイテムに対して tag で示されるタグを付けます。 x1x2 以下、y1y2 以下の数値でなければなりません。
pathName addtag tag withtag tagOrId
tagOrId で示されるアイテムすべてに tag で示されるタグを付けます。
pathName bbox tagOrId ?tagOrId tagOrId...?
tagOrId 以下で示されるアイテムを包含する長方形領域の 左上および右下の座標を「x1 y1 x2 y2」のリスト形式で返します。 指定した ID やタグにマッチするアイテムが無かったりした場合は、 空文字列が返ります。
pathName bind tagOrId ?sequence? ?command?
tagOrId 以下で示されるアイテムに対してイベントバインドを行ないます。 すなわち、アイテム上で sequence で示されるイベントが発生したとき、 command を実行するようにします。 書式は bind コマンド と同様です。
pathName cget option
option で示すオプションの値を返します。 例えば「.c cget -bg」とすると、 「SystemButtonFace」という値が返されたりします。
pathName configure ?option? ?value option value ...?
option と value を指定した場合は、 指定したオプションの値を value に設定します。 option を指定して value を省略した場合は、 当該オプションの値を返します。 オプションもすべて省略した場合は、 すべての有効なオプションと、 それに対して設定されている値のリストを返します。
pathName coords tagOrId ?x0 y0 ...?
pathName coords tagOrId ?coordList?
tagOrId 以下で示されるアイテムの座標を変更します。 座標指定を省略した場合は、当該アイテムの現在の座標情報が返されます。 tagOrId が複数のアイテムを指している場合は、 ディスプレイリスト上、最初のものが指定されたとみなされます。
pathName create type x y ?x y ..? ?option value ...?
pathName create type coordList ?option value ...?
type で示されるタイプの新しいグラフィックアイテムを作ります。 type に使えるものは後述します。 タイプに応じて座標指定方法は異なります。 また、座標指定に続けて、各種オプションを指定することが可能です。
pathName dchars tagOrId first ?last ?
tagOrId で示されるグラフィックアイテムを構成する座標の一部を削除します。 削除する範囲を firstlast で示します。 last を省略した場合は first の部分のみを削除します。 折れ線やポリゴンの場合は、x y のペアを削除することになりますが、 firstlast は座標リストの要素を x y を区別せずに先頭を 0 番目とみなして数えます。 例えば「.create line 10 10 20 50 30 30 40 80」として作った折れ線の場合、 「.c dchars tagOrId 2」とすると (20, 50) のペアが削除されますし、 「.c dchars tagOrId 2 4」とすると (20, 50) 〜 (30, 30) のペアが削除されます。 テキストアイテムの場合は、firstlast は文字位置を示します。
pathName delete ?tagOrId tagOrId ... ?
tagOrId 以下で示されるグラフィックアイテムを削除します。
pathName dtag tagOrId ?tagToDelete ?
tagOrId で示されるグラフィックアイテムに対して 付けられているタグを削除します。 削除するタグ名を tagToDelete で指定します。 tagToDelete を省略した場合は、tagOrId が指定されたものとみなします。
pathName find searchCommand ?arg arg ...?
searchCommand とそれに続く任意の引数で示される条件にマッチする グラフィックアイテムの ID のリストを返します。 searchCommand および続く引数には、 addtag ウィジットコマンドと同様のものが使えます。
pathName focus ?tagOrId?
tagOrId で示されるグラフィックアイテム(通常はテキストアイテム) に対してキーボードフォーカスをセットします。 tagOrId を省略した場合は現在フォーカスがセットされているアイテムの ID を返します。 tagOrId で示されるグラフィックアイテムが複数ある場合は、 ディスプレイリスト上最初のものにフォーカスをセットします。 tagOrId として空文字列を指定した場合は キーボードフォーカスがリセットされます。 実際にカーソルを点滅させるには、 後述の icursor ウィジットコマンドを併用し、 また、キャンバスウィジットに対して focus コマンドを使用して陽にフォーカスを設定します(focus .c とします)。
pathName gettags tagOrId
tagOrId で示されるグラフィックアイテムに対して 設定されているタグのリストを返します。 当該アイテムの ID と、デフォルトで設定される all というタグは 返り値には含まれません。 タグが無いか、または tagOrId で示されるアイテムが無い場合には 空文字列が返されます。
pathName icursor tagOrId index
tagOrId で示されるグラフィックアイテムに対して、 index が指す位置に挿入カーソルを設定します。
pathName index tagOrId index
tagOrId で示されるグラフィックアイテムの index が指す位置を数値型のインデックス値に変換します。
pathName insert tagOrId beforeThis string
tagOrId で示されるグラフィックアイテムの beforeThis が指す位置の直前に string を挿入します。 テキストアイテムの他、折れ線やポリゴンの座標挿入にも使えます。 折れ線やポリゴンの場合は、座標は x y のペアで指定しますので、 例えば「.c insert 3 4 {80 80}」のようにします (この例は、ID が 3 のアイテムの 4 番目の座標の前に (80, 80) という座標を挿入します。 この場合の 4 は、座標のペアの個数ではなく、 x y をバラでカウントしますので注意してください。 そのため、「.c insert 3 5 {80 80}」としても同じになります)。
pathName itemcget tagOrId option
pathName cget option」のグラフィックアイテム版です。
pathName itemconfigure tagOrId ?option? ?value option value ...?
pathName configure ?option? ?value option value ...?」 のグラフィックアイテム版です。
pathName lower tagOrId ?belowThis?
tagOrId で示されるグラフィックアイテムの ディスプレイリスト上の位置を、 belowThis の前に移動します。 belowThis を省略した場合はディスプレイリストの先頭に移動します。
pathName move tagOrId x y
tagOrId で示されるグラフィックアイテムを 水平方向に x 、垂直方向に y 移動します。
pathName postscript ?option value option value ...?
キャンバス上に描画されたグラフィックアイテム一式を PostScript に変換して返します。 オプションとして「-file ファイル名」を付ければファイルに出力します。 EPS 形式で出力できるので、ファイル名の拡張子を「.eps」 にしておけば、Word などのソフトで読み込むことが可能です。 ただし、テキストアイテムについては日本語を使うと出力されなかったり、 イメージやウィジットが出力されなかったりといった問題があります。 直線/折れ線、ポリゴン、長方形、楕円、円弧は出力されるので、 用途を限定すれば使えそうです。 -file 以外のオプションとしては、 「-colormode colorMode」(colorMode には colorgraymono のいずれかを指定。 それぞれフルカラー、白黒(中間色は灰色階調で表現)、 完全白黒(中間色無し)を意味します)、 「-width size」と「-height size」(出力範囲指定)、 「-x position」と「-y position」(出力位置指定)、 「-pagewidth size」と「-pageheight size」(出力サイズ指定) 「-rotate boolean」(90度回転するか否か)、 などがあります。
pathName raise tagOrId ?aboveThis?
tagOrId で示されるグラフィックアイテムの ディスプレイリスト上の位置を、 aboveThis の後に移動します。 aboveThis を省略した場合はディスプレイリストの末尾に移動します。
pathName scale tagOrId xOrigin yOrigin xScale yScale
tagOrId で示されるグラフィックアイテムを、 (xOrigin , yOrigin) を原点として、 水平方向に xScale 倍、垂直方向に yScale 倍します。
pathName scan mark x y
x y で指定される位置をマーク(記憶)します。 次の pathName scan dragto コマンドとセットで使います。
pathName scan dragto x y ?gain?
pathName scan mark コマンドでマークした位置と、 本コマンドで指定した座標との差を計算し、 その分だけキャンバスウィジット全体をスキャン(スクロール)します。 gain は差に対してスキャンする量を指定します。 gain のデフォルトは 10 です。
pathName select from tagOrId index
tagOrId で示されるグラフィックアイテムの index で示される位置にセレクション(選択領域)の先頭を設定します。
pathName select to tagOrId index
tagOrId で示されるグラフィックアイテムの index で示される位置にセレクション(選択領域)の末尾を設定します。 「pathName select from」 コマンドとペアでセレクション領域を設定することになります。
pathName select clear
セレクションをクリアします。
pathName select item
現在セレクションが設定されているグラフィックアイテムの ID を返します。
pathName select adjust tagOrId index
tagOrId で示されるグラフィックアイテムに セレクションが設定されている場合に機能し、 本コマンドの index で指定した位置から見て、 from 側と to 側のうち遠い方から、 本コマンドの指定位置までをセレクションとします。 to 側がまだ設定されていなければ、 「pathName select to」コマンドと同様の動作となります。
pathName type tagOrId
tagOrId で示されるグラフィックアイテムのタイプを返します。
pathName xview
2つの実数(0 から 1 の範囲)からなるリストを返します。 これはキャンバスのどの部分が見えているかを示します。 最初の数は、見えている部分(スクリーン上)の左端が、 キャンバスの左端からどのくらいの割合の位置かを示します。 2つ目の数は、見えている部分の右端が、 キャンバスの左端からどのくらいの割合の位置かを示します。 例えば、「0.1 0.7」という値が返ってきた場合、 見えている部分の左端が、キャンバスの左端から 0.1、 つまり 10% の位置であることを示しています。 また、見えている部分の右端が、キャンバスの左端から 0.7、 つまり 70% の位置であることを示しています。 したがってこの場合は、 キャンバスの左端の 10% が画面の左外側に隠れており、 キャンバスの右端の 30% が画面の右外側に隠れていることになります。
pathName xview moveto fraction
fraction の部分で指定する値は 0 から 1 の間の実数です。 キャンバスの左端からの位置が、 指定した割合の位置であるような場所を画面の左端に来るようにします。 つまり、キャンバスの左外側に隠れる割合を指定した割合にします。
pathName xview scroll number what
キャンバスを横方向にスクロールします。 what の値は units または pages です。 number には整数値を指定しますが、 whatunits なら、 オプション -xscrollincrement で指定した量の number 倍だけスクロールします。 whatpages なら、 画面の幅の 90% の number 倍だけスクロールします。 number に負の数を指定すると逆の方向にスクロールします。
pathName yview
2つの実数(0 から 1 の範囲)からなるリストを返します。 これはキャンバスのどの部分が見えているかを示します。 最初の数は、見えている部分の上端が、 キャンバスの上端からどのくらいの割合の位置かを示します。 2つ目の数は、見えている部分の下端が、 キャンバス上端からどのくらいの割合の位置かを示します。 例えば、「0.1 0.7」という値が返ってきた場合、 見えている部分の上端が、キャンバス上端から 0.1、 つまり 10% の位置であることを示しています。 また、見えている部分の下端が、キャンバスの上端から 0.7、 つまり 70% の位置であることを示しています。 したがってこの場合は、 キャンバスの上端の 10% が画面の上外側に隠れており、 キャンバスの下端の 30% が画面の下外側に隠れていることになります。
pathName yview moveto fraction
fraction の部分で指定する値は 0 から 1 の間の実数です。 キャンバスの上端からの位置が、 指定した割合の位置であるような場所を画面の上端に来るようにします。 つまり、キャンバスの上外側に隠れる割合を指定した割合にします。
pathName yview scroll number what
キャンバスを縦方向にスクロールします。 what の値は units または pages です。 number には整数値を指定しますが、 whatunits なら、 オプション -yscrollincrement で指定した量の number 倍だけスクロールします。 whatpages なら、 画面の高さの 90% の number 倍だけスクロールします。 number に負の数を指定すると逆の方向にスクロールします。

グラフィックアイテム

以下では各種グラフィックアイテムについて解説します。 グラフィックアイテムの種別(タイプ)を指定するコマンドとしては、 pathName create type があります。 また、pathName type tagOrId コマンドは タイプを表す文字列を返します。 テキストアイテム、折れ線(直線)、ポリゴンの3種は、 インデックスの概念を持ちます (テキストは文字の位置、他は図形を構成する点の座標の位置を示します)。

グラフィックアイテム共通オプション

最初にグラフィックアイテムに対する共通オプションを示します。 タイプによってはサポートされないものがあります。 何をサポートするのかについては、個々のグラフィックタイプの解説にて示します。

-dash pattern
-activedash pattern
-disableddash pattern
破線や点線のパターンを指定します。 パターンをどのように指定するのかについては キャンバスについての解説 で解説済みです。
-dashoffset offset
破線パターンのオフセットを指定します (試したところ、私の環境では効果がありませんでした...)。
-fill color
-activefill color
-disabledfill color
塗りつぶしの色を指定します。 空文字列を指定すると、塗りつぶしません (これがデフォルトです)。 line タイプの場合は線の色の指定になります。 text タイプの場合は文字の前景色の指定になります。
-outline color
-activeoutline color
-disabledoutline color
線の色を指定します。デフォルトは黒です。 空文字列を指定すると、線を描かないことを指定したことになります。
-offset offset
ビットマップイメージパターン(塗りつぶしパターンなどに使われます) のオフセットを、 x,y または n ne e se s sw w nw center の形式で指定します。 パターンそのものは、-stipple などのオプションで指定されます。
-outlinestipple bitmap
-activeoutlinestipple bitmap
-disabledoutlinestipple bitmap
線の部分のビットマップパターンをビットマップ名で指定します (試したところ、私の環境では効果がありませんでした...)。
-stipple bitmap
-activestipple bitmap
-disabledstipple bitmap
塗りつぶし部分のビットマップパターンをビットマップ名で指定します。 例えば、「-stipple gray25 -fill black」 などとすれば、内部を網かけで塗りつぶしたようにできます。
-state state
状態を指定します。 指定できる値は normal、 disabled、 hidden です。
-tags tagList
与えたタグのリストの要素をタグとして設定します。 tagList の部分には空文字列も指定でき、 その場合は設定したタグが削除されます。
-width outlineWidth
線幅を指定します。 折れ線(直線)やポリゴンについては描画している線の部分、 長方形や楕円などは枠線の部分に対する指定になります。 デフォルトは 1 です。

円弧

円弧のタイプ名は arc です。 円弧は次のコマンドで作ることができます。

pathName create arc x1 y1 x2 y2 ?option value option value ...?
pathName create arc coordList ?option value option value ...?

指定する座標は、 円弧を構成する楕円をちょうど囲む長方形の対角線の両端の座標です。 グラフィックアイテム共通オプションで使えるものは、次の通りです。

円弧に対しては、次の特殊オプションがあります。

-start degrees
円弧の開始を度の単位で指定します。 0 度は、時計の3時の方向です(これがデフォルト)。 角度は半時計周りに増えていきます (角度の測り方は分度器と同じだと思えばよいでしょう)。
-extent degrees
円弧の「広がり」を度の単位で指定します。 開始位置は -start オプションで指定したものです。 負の値も受け付けます。 360 よりも大きい値、または -360 よりも小さい値のときは、 360 で割った余りが使われます。 デフォルトは 90 です。
-style type
値としては pieslice(デフォルト)、 chord または arc のいずれかを指定可能です。 pieslice はピザを切るときの形になります。 chord を指定すると、 弧と半径の線が交差する2点を直線で結んだ線で切ります。 arc は弧の部分だけを描きます。 arc の場合は -fill オプションが無効になります。

ビットマップ

ビットマップのタイプ名は bitmap です。 ビットマップは次のコマンドで作ることができます。

pathName create bitmap x y ?option value option value ...?
pathName create bitmap coordList ?option value option value ...?

グラフィックアイテム共通オプションで使えるものは、次の通りです。

ビットマップに対しては、次の特殊オプションがあります。

-anchor anchorPos
指定した座標に対して、どのように配置するかを指定します。 anchorPos に指定できるのは n ne e se s sw w nw center です。 デフォルトは center です。
-background color
-activebackground color
-disabledbackground color
背景色を指定します。
-bitmap bitmap
-activebitmap bitmap
-disabledbitmap bitmap
ビットマップ名を指定します。
-foreground color
-activeforeground color
-disabledforeground color
前景色を指定します。

イメージ

イメージのタイプ名は image です。 イメージは次のコマンドで作ることができます。

pathName create image x y ?option value option value ...?
pathName create image coordList ?option value option value ...?

グラフィックアイテム共通オプションで使えるものは、次の通りです。

イメージに対しては、次の特殊オプションがあります。

-anchor anchorPos
指定した座標に対して、どのように配置するかを指定します。 anchorPos に指定できるのは n ne e se s sw w nw center です。 デフォルトは center です。
-image name
-activeimage name
-disabledimage name
イメージ名を指定します。 イメージはあからじめ image create コマンドで作っておく必要があります。

直線(折れ線)

直線のタイプ名は line です。 直線は次のコマンドで作ることができます。

pathName create line x1 y1 ... xn yn ?option value option value ...?
pathName create line coordList ?option value option value ...?

座標を3組以上指定すれば折れ線になります。 グラフィックアイテム共通オプションで使えるものは、次の通りです。

直線に対しては、次の特殊オプションがあります。

-arrow where
矢印を付けます。 where の部分には none first last both のいずれかを指定できます。 none がデフォルトで、この場合は矢印が付きません。 first は最初の座標の部分に矢印が付きます。 last は最後の座標の部分に矢印が付きます。 both は両端に矢印が付きます。
-arrowshape shape
矢印の形状を3つの数値のリストで指定します。 1番目の数値は、「矢じり」の「首」の部分の、矢印先端からの距離を指定します。 2番目の数値は、「矢じり」の「両翼」の部分の、矢印先端からの距離を指定します。 3番目の数値は、「矢じり」の「両翼」の部分の広がり(両翼間の距離) を指定します。
-smooth boolean
真にすると、ベジエ曲線となります。 デフォルトは偽です。
-splinesteps number
ベジエ曲線にするときの、ステップ数を指定します。 オプション -smooth の値が偽のときは無視されます。

楕円

楕円のタイプ名は oval です。 楕円は次のコマンドで作ることができます。

pathName create oval x1 y1 x2 y2 ?option value option value ...?
pathName create oval coordList ?option value option value ...?

指定する座標は、 楕円をちょうど囲む長方形の対角線の両端の座標です。 グラフィックアイテム共通オプションで使えるものは、次の通りです。

ポリゴン(多角形)

ポリゴンのタイプ名は polygon です。 ポリゴンは次のコマンドで作ることができます。

pathName create polygon x1 y1 ... xn yn ?option value option value ...?
pathName create polygon coordList ?option value option value ...?

始点と終点は自動的に結ばれます。 グラフィックアイテム共通オプションで使えるものは、次の通りです。

ポリゴンに対しては、次の特殊オプションがあります。

-smooth boolean
真にすると、ベジエ曲線となります。 デフォルトは偽です。
-splinesteps number
ベジエ曲線にするときの、ステップ数を指定します。 オプション -smooth の値が偽のときは無視されます。

長方形

長方形のタイプ名は rectangle です。 長方形は次のコマンドで作ることができます。

pathName create rectangle x1 y1 x2 y2 ?option value option value ...?
pathName create rectangle coordList ?option value option value ...?

指定する座標は、長方形の対角線の両端の座標です。 グラフィックアイテム共通オプションで使えるものは、次の通りです。

テキスト

テキストのタイプ名は text です。 テキストは次のコマンドで作ることができます。

pathName create text x y ?option value option value ...?
pathName create text coordList ?option value option value ...?

グラフィックアイテム共通オプションで使えるものは、次の通りです。

テキストに対しては、次の特殊オプションがあります。

-anchor anchorPos
指定した座標に対して、どのように配置するかを指定します。 anchorPos に指定できるのは n ne e se s sw w nw center です。 デフォルトは center です。
-font fontName
フォントを指定します。
-justify how
左寄せ、右寄せ、中央揃え、のいずれにするかを指定します。 指定できる値は、left right center です。 デフォルトは left です。
-text string
表示する文字列を指定します。 改行コードをを含めれば、表示上も改行されます。
-width length
幅を指定します。 この幅に収まらなければ、自動的に改行します。 値として 0 を指定すれば、文字列長が収まるように調整されます (つまり、改行コード以外で改行しません)。

ウィジット

ウィジットのタイプ名は window です。 ウィジットは次のコマンドで作ることができます。

pathName create window x y ?option value option value ...?
pathName create window coordList ?option value option value ...?

グラフィックアイテム共通オプションで使えるものは、次の通りです。

ウィジットに対しては、次の特殊オプションがあります。

-anchor anchorPos
指定した座標に対して、どのように配置するかを指定します。 anchorPos に指定できるのは n ne e se s sw w nw center です。 デフォルトは center です。
-height pixels
高さを指定します。
-width pixels
幅を指定します。
-wihdow pathName
描画するウィジットパスを指定します。 ウィジットはあらかじめ作っておかなければなりません。

Tcl/TkでWindowsプログラミング目次へ ↑