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

ちょっと変わり種のライブラリとして,Ruby/Tk インタープリタの
リモートコントロールを行うためのライブラリを commit しました.
これは MultiTkIp クラスの応用の一つで,Tcl/Tk の send コマンドを
使って実現されています.

# 「どうすれば自分の環境で 'send' コマンドが使えるように
# なるか」という質問は勘弁してください.(^_^;
# それについては Tcl/Tk の FAQ が参考になるはずです.

Tcl/Tk の web site にある「Tcl/Tk 8.5 の新機能」についての
ドキュメントによると,
----------------------------------------------------
    * send officially supported on Windows
----------------------------------------------------
などと書かれているので,最新の Tcl/Tk8.5a1 を使うようにすれば 
Windows 上でも試せるかもしれません.

# 私自身は Windows 上でのテストは行っていませんので,
# どなたかテスト結果を報告していただけると助かります.

ライブラリファイルである 'remote-tk.rb' は RemoteTkIp という
クラスを含んでいます.
次の例を見てください.
同じ 'TkButton.new()' がどの Ruby/Tk インタープリタ上に
ボタンウィジェットを生成するかは文脈依存になっています.
----------------------------------------------------
require 'remote-tk'

# start sub-process
ip_name = 'remote_ip'
ip_list = TkWinfo.interps
fork{
  exec "/usr/bin/env ruby -r tk -e \"Tk.appname('#{ip_name}');Tk.mainloop\""
}
sleep 1 until (app = (TkWinfo.interps - ip_list)[0]) && app =~ /^#{ip_name}/
p TkWinfo.interps

# create RemoteTkIp object
ip = RemoteTkIp.new(app)

# setup remote-ip window
btns = []
ip.eval_proc{
  btns << 
    TkButton.new(:command=>proc{
		   puts 'This procesure is on the controller-ip (Ruby-side)'
		 }, 
		 :text=>'print on controller-ip (Ruby-side)').pack(:fill=>:x)

  btns << 
    TkButton.new(:command=>
		   'puts {This procesure is on the remote-ip (Tk-side)}',
		 :text=>'print on remote-ip (Tk-side)').pack(:fill=>:x)

  btns << 
    TkButton.new(:command=>'ruby {
                   puts "This procedure is on the remote-ip (Ruby-side)"
                   p Array.new(3,"ruby")
                 }', 
		 :text=>'ruby cmd on the remote-ip').pack(:fill=>:x)

  TkButton.new(:command=>'exit', :text=>'QUIT').pack(:fill=>:x)
}

# setup controller-ip window
btns.each_with_index{|b, idx|
  TkButton.new(:command=>proc{ip.eval_proc{b.flash}}, 
	       :text=>"flash button-#{idx}", 
	       :padx=>10).pack(:padx=>10, :pady=>2)
}

TkButton.new(:command=>proc{exit}, :text=>'QUIT', 
	     :padx=>10, :pady=>7).pack(:padx=>10, :pady=>7)

# start eventloop
Tk.mainloop
----------------------------------------------------

もし興味があれば,CVS から最新版のソース (1.8.x と 1.9.x との両方に
commit してあります) を入手して試してみてください.
あまり詳細にはテストしていませんので問題が残っているかもしれません,
コメントやバグレポートがありましたらお送りいただけると幸いです.
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp