From: NAGAI Hidetoshi Date: 1998-06-17T13:39:33+09:00 Subject: [ruby-dev:2890] Re: TkMenu's bug 永井@知能.九工大です. >>>>> "M" == Yukihiro Matsumoto writes: M> In message "[ruby-dev:2885] Re: TkMenu's bug" M> on 98/06/16, NAGAI Hidetoshi writes: M> |tk.rb の利用者には,Tcl/Tk のパス文字列に変換しなければならないなどと M> |意識させたくはないので,現状では,たとえば initialize において M> |-------------------------------------------------------- M> |if keys['create'] M> | @p_create = keys['create'] M> | if @p_create.kind_of? Proc M> | keys['create'] = proc{@id = @p_create.call; @id.path} M> | end M> |end M> |-------------------------------------------------------- M> |というような感じに wrap してやろうかと思っています. M> えーと,私の勘違いかも知れませんが,TkObjectをtcl側に渡す時 M> にパスへの変換は自動的に行われると思うのですが,それでは足り M> ないのでしょうか? すみません.勘違いしていました. 上記の場合の proc では @id.path は必要ありませんでした. ですが,やはり install_cmd というか,TkCore.callback での対処は 必要なようです.たとえば, -------------------------------------------------------- def foo TkFrame.new end TkButton.new{text 'foo'; command proc{foo}; pack} Tk.mainloop -------------------------------------------------------- で,ボタンを押すと TypeError でこけます. 以前は Qnil を返していたから問題はないのですが, 値を返すようになってしまったため,Tcl/Tk に組み入れた ruby コマンドが エラーを出してしまいます. M> |次に,hash_kv ですが,値として TkObject のサブクラスが来た場合には, M> |その path を値にしてやる必要があるのではないでしょうか? M> これはその後段のtk_callの中で変換されるはずなので,不要だと M> 思います.むしろ,hash_kvの中のProcの変換を_get_eval_string M> に移動すべきでしょう. あれ? 何だったかの処理の時に,これを追加しとかないと コケたような記憶があるのですが... 勘違いしていただけかもしれません.すみませんでした. M> |以下は,「これはあってもいいかも?」というものです. M> |module Tk に次の定数を追加. M> |----------------------------------------------------------- M> | TCL_VERSION = INTERP._invoke("info", "tclversion") M> | TK_VERSION = INTERP._invoke("set", "tk_version") M> |----------------------------------------------------------- M> 邪魔にならないと思うので,採用します. ありがとうございます. これで,Tk4.x と Tk8.x での条件分けの際に, tk_call を使用しなければならないことから解放されます. M> |次のメソッドを追加. M> |----------------------------------------------------------- M> | def Tk.setPalette(*args) M> | def Tk.bisque M> |----------------------------------------------------------- M> |# これ ↑ は重要性は低いかもしれません. M> これらはtclで書かれたライブラリですよね.tclで書かれたものは M> 外に出しておきたいという望みがあります.別のファイルにまとめ M> るのが良いかもしれません. わかりました. TkPalette クラスとしてファイル tkpalette.rb にまとめることにします. M> |現在の tk.rb の bind では Tcl/Tk における M> |bind . ... のような M> |イベント列を扱うことができません. M> そうですね._bindを書き換えれば対応できると思いますが,どの M> ような仕様にするのが使いやすいと思いますか? そうですねぇ... こんな感じで配列での指定可能とするのはいかがでしょうか? ---------------------------------------------------------- def _bind(path, context, cmd, args=nil) begin id = install_bind(cmd, args) if context.kind_of? Array tk_call 'bind', path, "<#{context.join('><')}>", id else tk_call 'bind', path, "<#{context}>", id end rescue : : ---------------------------------------------------------- # いまのままでも,bind('Control-x>