[ruby-list:50171] Re: Ruby/Tkでのキャンバス上のアイテム作成
From:
Naoki Oshiro <oshiro@...>
Date:
2015-06-15 13:27:03 UTC
List:
ruby-list #50171
こんにちは。大城です。
だいぶ間が空いてしまいましたが、TkCanvasへアイテム生成のメソッドを追加するgemをbundlerで作成してみています。参考までに添付致します。
内容としてはこれまでに教えて頂いた内容だけの、以下のように非常に簡単なものです(実際のgemにはバージョンファイル等の読み込みも入ってきますが)。
require "tk"
class TkCanvas
TkcItem::CItemTypeToClass.each {|k, v| class_eval("def
create_#{k}(*args); #{v}.create(self, *args); end")}
end
今回、パッケージ名について教えて頂きたいのですが、皆さんけっこう自由につけていますよね?命名ルールはあるのでしょうか?
今のところ、対象そのままの名前を表したtkcanvというものと、キャンバスを拡張するということでcanvexというものを考えていますが、「canvex」というとそれのみで何かの単語になっていそうですし、「拡張」というほど大したことはしておらず、また「あ、require
"tk" じゃなくて、"canvex" だった」と書き換えが生じる際にいちいちtkを消して書きなおす精神的ダメージがでかそうです。
かといって、tkcanvというとTkパッケージに標準で付いていそうな名前になってしまって、ここまでの名前を勝手に使っていいのかが躊躇されます。あと、名前は少しでも短くするためにtkcanvとしましたが、うっかり忘れてしまいそうなので、可能であれば下手に略さずtkcanvasとそのものズバリがよさそうな気もしますが、さらにここまでズバリと使っていいのかどうかと…。
何かご意見頂ければ嬉しいです。
よろしくお願い致します。
2015年3月10日 3:56 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>:
> 永井@知能.九工大です.
>
> 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)
> 九州工業大学大学院情報工学研究院知能情報工学研究系知能情報メディア部門助教
--
=============================================
OSHIRO Naoki: oshiro@mibai.tec.u-ryukyu.ac.jp
http://mibai.tec.u-ryukyu.ac.jp/~oshiro/
Attachments (1)
tkcanv-0.0.1.gem
(6.5 KB, Archive)