[ruby-list:50097] Ruby/Tkでのキャンバス上のアイテム作成

From: Naoki Oshiro <oshiro@...>
Date: 2015-03-06 08:11:10 UTC
List: ruby-list #50097
こんにちは。大城です。

Ruby/Tkのキャンバス上でのアイテム作成は、各アイテムクラスでインスタンス生成するかと思っていましたが、キャンバスクラスにもcreateメソッドがあったんですね。

require "tk"
c = TkCanvas.new {pack}
TkcLine.new(c, 10, 10, 100, 10, fill: "blue")
c.create("line", 10, 20, 100, 20, fill: "red")
Tk.mainloop

個々のアイテムのクラスを使うより、キャンバスクラス(インスタンス)のみを使っているほうがすっきりして、またTclでの記述とも似ているので馴染みがいい気がします。

また、PerlやPythonですと、キャンバスのアイテム作成用のメソッド名は create_line などがあるようです。

 Tcl: .canvas create line 10 10 200 50
 Ruby: TkcLine.new( canvas, 10, 10, 200, 50)
 Perl: $canvas->create_line(10,10,200,50);
 Python: canvas.create_line(10, 10, 200, 50)
 [http://www.tkdocs.com/tutorial/canvas.html  TkDocs - Tk Tutorial - Canvas]

Rubyのキャンバスクラスでも同じようなメソッド名にしてはどうかと、TkCanvas::createで使っているTkcItem::CItemTypeToClassのアイテム名/クラス名の情報を使って次のようにメソッドを定義してみました:

class TkCanvas
  TkcItem::CItemTypeToClass.each do |k, v|
    class_eval("def create_#{k}(*args); #{v}.create(self, *args); end")
  end
end

上記の定義を使うと以下で書けます。

c.create_line(10, 30, 100, 30, fill: "green")

他との類似も考えて、こちらあたりにしてもいいとも思うのですがいかがでしょうか?

また、現行で各アイテムのコンストラクタを使用する場合と、キャンバスのcreateメソッドを使用する場合では推奨されているものはあるでしょうか?

以上、よろしくお願いします。

#もし、他にRuby/Tk用のMLがある場合は、ご紹介頂けると助かります。

-- 
=============================================
OSHIRO Naoki: oshiro@mibai.tec.u-ryukyu.ac.jp
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/
(本メール内容に関連⇒http://mechsys.tec.u-ryukyu.ac.jp/~oshiro/SiteList/2015/03/04/2903 )

In This Thread

Prev Next