113.64 Tkcanvas

このドライバは、以下のスクリプト言語のうちの一つの Tk canvas widget コマンドを生成します: Tcl (デフォルト), Perl, Python, Ruby, REXX。

書式:

     set terminal tkcanvas {tcl | perl | perltkx | python | ruby | rexx}
                           {standalone | input}
                           {interactive}
                           {rounded | butt}
                           {nobackground | background <rgb color>}
                           {{no}rottext}
                           {size <width>,<height>}
                           {{no}enhanced}
                           {externalimages | pixels}

結果を表示するには、以下の Tcl/Tk コマンド列を実行します:


     package require Tk
     # 以下の 2 行は、外部画像を使用する場合にのみ必要
     package require img::png
     source resize.tcl
     source plot.tcl
     canvas .c -width 800 -height 600
     pack .c
     gnuplot .c

Perl/Tk の場合は、以下のようにします:


     use Tk;
     my $top = MainWindow->new;
     my $c = $top->Canvas(-width => 800, -height => 600)->pack;
     my $gnuplot = do "plot.pl";
     $gnuplot->($c);
     MainLoop;

Perl/Tkx の場合は、以下のようにします:


     use Tkx;
     my $top = Tkx::widget->new(".");
     my $c = $top->new_tk__canvas(-width => 800, -height => 600);
     $c->g_pack;
     my $gnuplot = do "plot.pl";
     $gnuplot->($c);
     Tkx::MainLoop();

Python/Tkinter の場合は、以下のようにします:


     from tkinter import *
     from tkinter import font
     root = Tk()
     c = Canvas(root, width=800, height=600)
     c.pack()
     exec(open('plot.py').read())
     gnuplot(c)
     root.mainloop()

Ruby/Tk の場合は、以下のようにします:


     require 'tk'
     root = TkRoot.new { title 'Ruby/Tk' }
     c = TkCanvas.new(root, 'width'=>800, 'height'=>600) { pack  { } }
     load('plot.rb')
     gnuplot(c)
     Tk.mainloop

Rexx/Tk の場合は、以下のようにします:


     /**/
     call RxFuncAdd 'TkLoadFuncs', 'rexxtk', 'TkLoadFuncs'
     call TkLoadFuncs
     cv = TkCanvas('.c', '-width', 800, '-height', 600)
     call TkPack cv
     call 'plot.rex' cv
     do forever
         cmd = TkWait()
         if cmd = 'AWinClose' then leave
         interpret 'call' cmd
     end

gnuplot が生成するコード (上の例では、"plot.<ext>" として書き出され ているものです) は、以下のような手続き関数を含んでいます:

gnuplot(canvas)

  引数として canvas の名前を取ります。
  これを呼び出すと、その canvas をクリアし、canvas のサイズを探し、そ
  の中にグラフを描き、それに合うように伸縮します。

gnuplot_plotarea()

  canvas スクリーン座標での描画領域の境界 (xleft, xright, ytop, ybot)
  を含むリストを返します。
  2 次元グラフ描画 (`plot`) に対してのみ動作します。

gnuplot_axisranges()

  グラフ座標での 2 つの軸の範囲 (x1min, x1max, y1min, y1max, x2min,
  x2max, y2min, y2max) を返します。
  2 次元グラフ描画 (`plot`) に対してのみ動作します。

オプション standalone を使えば、自己完結した最小スクリプトを生成でき ます。デフォルトは input で、これは取り込まれるべきスクリプトを作りま す (すなわち、load されるか call されるか、または選択した言語用のなんら かの適切な方法で)。

オプション interactive を指定すると、一つの線分上でマウスクリックした ときにその中点の座標が標準出力に出力されるようになります。 この動作は、user_gnuplot_coordinates という手続き関数を定義することで、 別なものに置き換えることも可能です。その手続き関数には以下の引数が渡されます:

 win id x1s y1s x2s y2s x1e y1e x2e y2e x1m y1m x2m y2m,

これらは、canvas の名前、線分の id、2 つの座標系でのその線分の開始点の 座標、終了点の座標、中点の座標です。中点の座標は、対数軸に対してのみ与 えられます

デフォルトでは、canvas は transparent ですが、オプション background で、明示的に背景色を設定することもできます。

rounded は、線の端や接合部を丸くします。 デフォルトの butt は、尖った端と角張った接合部を使用します。

オプション rottext で、文字列の任意角での回転を有効にできますが、それ には Tcl/Tk 8.6 以降が必要です。デフォルトは norottext です。

オプション size は、目盛りの刻みとフォントサイズを、指定された canvas サイズに対して最適化なものにしようとします。デフォルトでは、出力サイズ は 800 x 600 ピクセルとしています。

enhanced は、拡張文字列処理を選択します (デフォルト) が、これは今のと ころ Tcl でのみ利用可能です。

オプション pixels (デフォルト) は、フェールセーフなピクセル毎の画像処 理ルーチンを選択します。以下参照: image pixels (p. [*])。 オプション externalimages は、画像を外部 PNG 画像として保存し、それを あとで tkcanvas コードが読み込んで伸縮します。このオプションは、Tcl で のみ有効で、しかも Tk の画像処理ルーチンが任意の伸縮を提供していないた めに、ある状況では遅くなります。この場合、スクリプトで、提供される rescale.tcl を取り込まなければいけません。

対話型モードは、Python/Tk, Rexx/Tk ではまだ実装されていません。Ryby/Tk の対話型モードは、まだ user_gnuplot_coordinates をサポートしていません。

竹野茂治@新潟工科大学
2020-05-27