[ruby-list:42968] IRB on a text widget of Ruby/Tk

From: Hidetoshi NAGAI <nagai@...>
Date: 2006-11-06 08:58:56 UTC
List: ruby-list #42968
永井@知能.九工大です.

通常のコンソールを使わず,Ruby/Tk のテキストウィジェットを
コンソール代わりにして IRB を動作させるものを
Ruby/Tk のサンプルスクリプトとして作りましたので
お知らせしておきます.

これを最も嬉しく感じるのは,Windows ユーザかもしれません.

Windows のコマンドプロンプトで IRB を動かした場合,
コンソールからの読み込みで I/O がブロックしてしまうため,
Ruby のスレッド切り替えがうまく行われませんでした.
これは Thread.new{loop{sleep 2; p 111}} とでも実行してみれば
簡単に確認できると思います.

要は入出力にブロックしてしまう I/O を用いているのが原因ですので,
ブロックしない入出力を用意してやればいいわけです.
で,Ruby/Tk のテキストウィジェットをその目的に活用しています.

# Ruby/TkORCA の開発の副産物を利用しています.

Ruby/Tk を使ってますので,Ruby/Tk のイベントループも
裏で実行されており,Ruby/Tk のルートウィジェットも
表示された状態で起動されます.

# ルートウィジェットを隠した状態で動作させるようなオプションを
# 追加することは簡単ですが,今は対応していません.

Tcl/Tk の wish をイメージしてもらえばいいかもしれません.
wish のようにシェルコマンド等を呼び出したりはしませんが,
インタラクティブに Ruby/Tk のウィジェットを作成したり
操作したりすることができます.

# Linux では Thread.new{Tk.mainloop} の実行で OK でしたが,
# Windows では I/O のブロックによりダメでした.

なお,バックグラウンドで文字列が出力され続けていたとしても
入力しづらくはならないような工夫 (というほどでもないが) も
行っていますので,Win ユーザ以外にも利点があるかもしれません.

もし興味があれば,お試しください.

お試しいただける場合は,Ruby のソースコードの CVS において,
ext/tk/sample ディレクトリにある tktextio.rb と irbtkw.rbw とを
入手し,同じディレクトリに置いてください.
Ruby/Tk が使える ruby で irbtkw.rbw を実行すれば動作するはずです.
きちんと試したわけではないですが,1.8.2 以降くらいなら
動作するのではないかと思います.

# .rbw という拡張子は Windows 向けです.

tktextio.rb というファイルは以前から存在しましたが,
今回かなりの変更が加えられた結果,以前のものは使えませんので
ご注意下さい.

仕組みが仕組みですので,通常のコンソールに比べれば
非常に動作が遅い (特に1文字ごとに flush などされると悲惨) のですが,
少しでも楽しんでいただけますと幸いです.
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai@ai.kyutech.ac.jp

In This Thread

Prev Next