永井@知能.九工大です.

From: Naoki Oshiro <oshiro / mibai.tec.u-ryukyu.ac.jp>
Subject: [ruby-list:50100] Re: Ruby/Tkでのキャンバス上のアイテム作成
Date: Sun, 8 Mar 2015 17:11:40 +0900
Message-ID: <CANd9fdDZrebYMU+5M3yXKYNn+2BTq0X+gUAaxcbSTY+Cf8YZwg / mail.gmail.com>

> TkcTagAccessモジュール (canvastag.rb)
> でTkcItemクラスに各アイテムへのコマンド割り当てがなされているのを今回知りました。また、tkclass.rbを使うと接頭のTkを外した形でのクラス名指定(TkCanvas⇒CanvasやTkcLine⇒Lineなど)もできるようになっていたのですね。こちらを使うと種々の基本的なクラス名(Frame,
> Label, Entry, Lineなど)がTk寄りになり過ぎる感もありますが。

Tk::Label とか Tk::Entry とかでも定義されてますから,例えば
-------------------------------
module My_GUI
  include Tk
  r = Root.new
  r.wm_title 'HOGE'
  Label.new(r, :text=>'sample').pack
  Button.new(r, :text=>'quit', :command=>proc{exit}).pack
end
-------------------------------
なんてこともできます.

> canvasは元がTclで使い慣れているので、私の場合は「.c create line XX
> YY」の語順に近いほうが馴染みがあるようです。gem化等々してみますかね(といっても、実質は先のメールで書いたclass_eval一行ですが…)。
   (snip)
> method_missingでの対応のご紹介ありがとうございました。こちらの場合は、create_XXXXのメソッドの使用時に毎回method_missingへの呼び出しが起こるのですよね?アイテム生成時のみですから、そこまでのコストではないのでしょうけど。

確かに method_missing の方がコストはかかるでしょうね.
メソッド定義と method_missing での対応とは併存できますので,
お好みのように定義いただいても支障は出ないと思います.

ただ,create(type, *opt) の形式にも利点はあって,
-------------------------------
items = [ 
  [TkcLine, 0, 0, 100, 100, {:fill=>'red'}],
  [TkcLine, 0, 0, 100, 150, {:fill=>'blue'}],
  [TkcLine, 0, 0, 100, 200, {:fill=>'green'}],
   ... 
]

TkCanvas.new{|c|
  items.each{|type, *opts|
    c.create(type, *opts)
  }
}.pack
-------------------------------
のように描画定義をまとめて記述したりする場合に便利なんですよね.(^_^)
-- 
永井 秀利  (nagai / ai.kyutech.ac.jp)
九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教