From: Naoki Oshiro Date: 2015-03-06T17:11:10+09:00 Subject: [ruby-list:50097] Ruby/Tkでのキャンバス上のアイテム作成 こんにちは。大城です。 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 )