ruby/tk FAQ とりあえず 中村 典嗣著 15 Dec 1999 この文書は、Perl/Tk FAQ 1.00_07 を手本にして ruby/tk FAQ を作成したも のです。 linuxdoc-sgmlを使用していますが、使い始めたばかりなので、ま だ、良く分かっていないため、いろいろ変だと思います。まあ、内容もそうな んですが。 ______________________________________________________________________ Table of Contents: 1. ruby/tk とは何ですか? 2. ruby/tk と tcltk, tcltklib ライブラリの違いは何ですか? 3. ruby/tk をインストールするのに Tcl/Tk は必要ですか? 4. どこにあるの? 5. どこ? ruby の配布先は 6. どうやってインストールするの? 7. ドキュメントはどこにありますか? 7.1. ruby/tk のマニュアル 7.2. ruby のマニュアル 7.3. Tcl/Tk のマニュアル 8. どうやって ruby/tk スクリプトを書けば? 9. ruby/tk で使える widget の種類は? 10. How do I get widget X to do Y ? 10.1. ボタンを押したとき実行されるコマンドを ruby のメソッドに結びつ けるには? 10.2. ボタンの上にマウスが来たときにイメージを変更するには? 10.3. widgets の配置はどうやったら良いの? 10.4. ダイアログとか、メニューとか、 その他ポップアップするようなの はどうやったら? 10.5. キーアクションと動作を結びつけるには? 10.6. キーバインディングを加えるには? 10.7. スケールの動きをバインドするには? 10.8. 一つのスクロールバーを複数の widgets に結びつけるには? 10.9. ビットマップを表示するには? 10.10. イメージを表示するには? 10.11. どんなイメージが表示できますか? 10.12. リストボックス 10.13. テキスト widget 10.14. ラジオボタンのグループ化 10.15. フォントの指定 10.16. エントリー widgetの内容を取り出すには? 10.17. エントリーでパスワード入力を隠すには? 10.18. エントリーで入力幅を制限するには? 10.19. メニュー 11. キャンバスにはどうやって? 11.1. キャンバスにビットマップを表示するには? 11.2. 表示したのを消すには? 11.3. キャンバスにイメージを表示するには? 11.4. キャンバス上にどのようなものが描画できますか? 11.5. キャンバス上に線を再描画するには? 11.6. キャンバスのデータを PostScript(c)に出力するには? 11.7. キャンバスの大きさを表示するには? リサイズ後は? 12. 共通した問題 12.1. => とか . とかの意味は? 12.2. カーソルやカラーを変えるには? 12.3. ベルを鳴らすには? 12.4. 実行時に ruby や、ruby/tk や、Tcl/Tk のバージョンを知るには? 13. Tcl/Tk と ruby/tk との違いは? 14. どうやって新しいスクリプト、モジュール、拡張を入れたら良いの? 15. どうやって新しいモジュールを書けば良いの? 16. 複合 Widgets について 16.1. ダイアログボックスありますか? 16.2. ファイル選択は? 16.3. カラーエディターは? 16.4. tkerror に相当するものは? 16.5. テーブルはありますか? 17. プログラミング開発ツール 17.1. Tcl/Tk から ruby/Tk へのコンバータありますか? 17.2. ruby/tk 用のデバッガってありますか? 17.3. ruby/tk に GUI ビルダーありますか? 18. どうやったらスクリーンをクリアできるの? 19. ruby/tk の中で X アプリケーションを描画? 20. Microsoft Windows(tm) でも使えますか? 21. ruby/tk では、日本語使えるの? 22. ruby から使えるツールキットって他にありますか? 23. どこで、グラフィックス関連の情報を得られますか? 24. ruby/tk で書かれた主なアプリケーションは? 25. ruby/tk の歴史は? 26. 将来 27. どうやったらこの FAQ の最新バージョンを手に入れられるの? 28. 謝辞 ______________________________________________________________________ 1. ruby/tk とは何ですか? ruby/tk は、強力なオブジェクト指向スクリプト言語であるrubyと、手軽に GUI プログラムを作成できる Tcl/Tk を組み合わせることで、楽しく、プログ ラムをすることを目指したものです。 2. ruby/tk と tcltk, tcltklib ライブラリの違いは何ですか? tcltk ライブラリは、 Tcl/Tk の C ライブラリを利用するための高(中?)水準 インターフェースを提供します。このライブラリは ruby から Tcl/Tk ライブ ラリを利用するためのもので、内部で tcltklib ライブラリを利用していま す。 tcltklib ライブラリは、 Tcl/Tk の C ライブラリを利用するための低水準イ ンターフェースを提供します。 (<-- マニュアルから引っ張って来ただけ) 3. ruby/tk をインストールするのに Tcl/Tk は必要ですか? ruby/tk は、Perl/Tk とは違い、Tcl/Tk から独立していませんので、 (とい うよりもソースに含まれていないというべきか?) ヘッダ tcl.h, tk.h とラ イブラリ libtcl*, libtk* が必要です。 (tclConfig.sh, tkConfig.sh は使 用しないのかな?) つまり、あらかじめ Tcl/Tk をインストールしておけば、 Tcl/Tk の全ソース は必要では、ありません。 4. どこにあるの? ソースコード ruby のソースに含まれています。 rubyのソースの配布先は、 ftp の ミラー を見てくださ い。 バイナリー なし。rpm, deb とかには、含まれているのか? Physical メディア ruby本におそらく付くでしょう? 5. どこ? ruby の配布先は ftp のミラー を見てください 6. どうやってインストールするの? Tcl/Tk 例えば、tcl8.05 + jp パッチの場合 (ファイル名は適宜読み変えてく ださい) ________________________________________________________________ % mkdir tcl-tk8.0.5jp1.6 % cd tcl-tk8.0.5jp1.6 % tar zxvf tcl8.0.5.tar.gz % tar zxvf tk8.0.5.tar.gz % cd tcl8.0.5 % zcat tcl8.0.5jp1.6.patch.gz | patch -p1 % cd ../tk8.0.5 % zcat tk8.0.5jp1.6.patch.gz | patch -p1 % cd ../tcl8.0.5/unix % ./configure --enable-shared % make % make test % cd ../../tk8.0.5/unix/ % ./configure --enable-shared --with-tcl=../../tcl8.0.5/unix % make % make test # cd tcl8.0.5/unix % make -n install # make install # cd ../../tk8.0.5/unix/ % make -n install # make install ________________________________________________________________ ruby ________________________________________________________________ % ./configure % make # make install ________________________________________________________________ うまく行かない場合は、ext/tcltklib/extconf.rb を直したりする。 ruby/tk の動作する環境の例 o FreeBSD: o Linux: o SunOS: o Solaris: o Windows: Mac はどうなんだろう? 7. ドキュメントはどこにありますか? 7.1. ruby/tk のマニュアル man ページ man 形式はなし。HTML 形式は、ruby のマニュアルに付属? ニュースグループ fj.comp.lang.ruby メーリングリスト ruby-list@netlab.co.jp デモプログラム contrib/ にあります。 Ruby_Tk-widget-demo-*.tar.gzという感じの ファイル。と、Tcl/Tk8.1用のデモが立石さんWeb から手にいれることができます。 インターネット上の ruby/tk リソース Ruby関連MLトピックス Tkの項目が参考になります。 Ruby/Tk チュートリアル 平松さんのページ rubyによるVerilog用波形ビューワ 菊谷さんのページ ruby で楽しいプログラミング 近藤さんのページ Ruby工房 五十嵐さんのページ rubyの指環 江田さんのページ Ruby Ruby Ruby 高橋さんのページ Ruby > (Smalltalk + Perl) / 2 greenteaさんのページ。『入門 tcl/tk』のサンプルコード をruby/tkのコードに変換しています。 Ruby/Tk で遊ぼう さとうさんのページ。 その他のリソース NIFTY Serve FGALTS MES5 「純正和製|ruby天国/みんなで遊ぼう!」 7.2. ruby のマニュアル 紙の ruby 本も出版されました。雑誌でも、数多く記事になっています。出版 物(主に雑誌)に登場したRuby を 御覧ください。 man ページ man はソースに付いています。 HTML 形式は、doc/ にあります。リ ファレンスマニュアルが contrib/ に rubytk-*.rd.gz という感じの ファイル名であります。 ニュースグループ fj.comp.lang.ruby メーリングリスト ruby-list@netlab.co.jp デモプログラム ソースの中の ext/tk/sample にあります。 インターネット上の rubyリソース Ruby関連ページたち を見 てください。 その他のリソース NIFTY Serve FGALTS MES5 「純正和製|ruby天国/みんなで遊ぼう!」 7.3. Tcl/Tk のマニュアル ruby/tk を使うには、Tcl/Tk の知識も必要です。 Tcl/Tk の文献は、… 入門Tcl/Tk 入門Tcl/Tk 入門 tcl/tk 入門 tcl/tk Tcl/Tk入門 Tcl/Tk入門 Tcl/Tkプログラミング入門 Tcl/Tkプログラミング入門 Tcl&Tkツールキット Tcl&Tkツールキット はじめてのTcl/Tk はじめてのTcl/Tk 8. どうやって ruby/tk スクリプトを書けば? 他の ruby スクリプトと同じように書き始めます。例えば、 #!/usr/local/bin/ruby 一番簡単な "こんにちは" を表示するスクリプトはこう書けます。 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" TkLabel.new { text 'こんにちは' }.pack TkButton.new { text '終了' command 'exit' }.pack Tk.mainloop ______________________________________________________________________ 別の書き方をすると、 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" TkLabel.new { text 'こんにちは' pack } TkButton.new { text '終了' command 'exit' pack } Tk.mainloop ______________________________________________________________________ ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" TkLabel.new (Tk.root, 'text' => 'こんにちは').pack TkButton.new (Tk.root, 'text' => '終了', 'command' => 'exit').pack Tk.mainloop ______________________________________________________________________ 9. ruby/tk で使える widget の種類は? Tcl/Tk で使えるもの+α (使える widget の種類でなくクラスを書くべき か?) Combobox [ruby-list:18167] 10. How do I get widget X to do Y ? もし、ボタンが欲しかったら、 TkButton.new とすれば良い。もし、このボタンに後で操作を加えたいならば、 button = TkButton.new というように、〜を変数に入れておく。これだけでは、画面に表示されないの で、 button.pack と、pack する。とりあえず、ボタンを表示するスクリプトの全部を書くと、 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" button = TkButton.new button.pack Tk.mainloop ______________________________________________________________________ のようになる。このボタンには、ラベルがついていないが、 configure メ ソッドでつけることができる。 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" button = TkButton.new button.configure('text' => 'Press me!') button.pack Tk.mainloop ______________________________________________________________________ このスクリプトを別の書き方をすると、次のようになる。 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" button = TkButton.new { text 'Press me!' }.pack Tk.mainloop ______________________________________________________________________ このコードでは、ボタンを押しても何も起こらない。ボタンを押したときの動 作をメソッドにバインドする仕方は、後ほど… 10.1. ruby のメソッドに結びつけるには?ボタンを押したとき実行されるコ マンドを command option?でボタンを作成したときか、packしたときにこうやって指定 すれば良い。 10.2. ボタンの上にマウスが来たときにイメージを変更するには? imageとactiveimageを指定する 10.3. widgets の配置はどうやったら良いの? Tcl/Tk と同様に、packer, placer, grid を使用する。 widget.pack ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" top2 = TkToplevel.new frame = TkFrame.new(top2) frame.pack TkLabel.new(frame) { text 'Left2' pack('side' => 'left') } TkLabel.new(frame) { text 'Right2' pack('side' => 'right') } TkLabel.new(top2) { text 'Bottom2' pack('side' => 'bottom') } Tk.mainloop ______________________________________________________________________ 10.4. その他ポップアップするようなのはどうやったら?ダイアログとか、 メニューとか、 シンプルなダイアログボックスは、TkDialog クラスを使えば良いでしょう。 もし、TkDialog クラスなどを使わないのであれば、 top = TkToplevel.new などのように、TkToplevel クラスを使用します。 10.5. キーアクションと動作を結びつけるには? widget.bind('', action) or widget.bind '', action 10.6. キーバインディングを加えるには? 10.7. スケールの動きをバインドするには? ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" items = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve"] scroll = TkScrollbar.new box = TkListbox.new { relief 'sunken' # width -1 height 5 setgrid 'yes' yscrollcommand proc{|idx| scroll.set *idx} }.pack('side'=>'left','fill'=>'both','expand'=>'yes') scroll.command(proc{|*args| box.yview *args}) scroll.pack('side'=>'right', 'fill'=>'y') for i in items box.insert 'end', i end Tk.mainloop ______________________________________________________________________ 10.8. 一つのスクロールバーを複数の widgets に結びつけるには? 10.9. ビットマップを表示するには? TkLabel.new { bitmap 'bitmap-name' }.pack('side' => 'top') TkLabel.new { bitmap ('@' + ['.','images','face.bmp'].join(File::Separator)) }.pack('side' => 'top') 10.10. イメージを表示するには? ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" TkLabel.new { text 'Main' }.pack $imggif = TkPhotoImage.new { file '/usr/local/lib/tk4.2jp/demos/images/earth.gif' } TkLabel.new { image $imggif }.pack TkButton.new { text 'close' command 'Tk.root.destroy' }.pack('side' => 'left') TkButton.new { text 'exit' command 'exit' }.pack('side' => 'right') Tk.mainloop ______________________________________________________________________ 10.11. どんなイメージが表示できますか? Tcl/Tk に準ずる 10.12. リストボックス 10.13. テキスト widget 10.14. ラジオボタンのグループ化 variable を指定。variable は、TkVariable クラスを使用。 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" letters = TkVariable.new TkRadioButton.new { bitmap '@/usr/local/lib/tk4.2jp/demos/images/letters.bmp' variable letters value 'full' }.pack TkRadioButton.new { bitmap '@/usr/local/lib/tk4.2jp/demos/images/noletter.bmp' variable letters value 'empty' }.pack Tk.mainloop ______________________________________________________________________ 10.15. フォントの指定 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" TkLabel.new { text 'Foo' font 'fixed' }.pack Tk.mainloop ______________________________________________________________________ 10.16. エントリー widgetの内容を取り出すには? ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" def do_print(entered) print "The string \"#{entered}\" was entered.\n" end $user_entry = TkVariable.new entry = TkEntry.new { textvariable $user_entry }.pack TkButton.new { text '表示' command proc { do_print $user_entry.value} }.pack Tk.mainloop ______________________________________________________________________ 10.17. エントリーでパスワード入力を隠すには? show というのを使用します。 $user_entry = TkVariable.new entry = TkEntry.new { textvariable $user_entry show '*' }.pack 10.18. エントリーで入力幅を制限するには? 10.19. メニュー 11. キャンバスにはどうやって? 11.1. キャンバスにビットマップを表示するには? canvar = TkCanvas.new TkcBitmap.new(canvar, 50, 50, 'bitmap' => '@/usr/local/lib/tk4.2jp/demos/images/letters.bmp') canvar.pack 11.2. 表示したのを消すには? canvar.delete(bittag) 11.3. キャンバスにイメージを表示するには? ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" canvas = TkCanvas.new image = TkPhotoImage.new('file' => '/usr/local/lib/tk4.2jp/demos/images/earth.gif') TkcImage.new(canvas, 50, 50, 'image' => image) canvas.pack Tk.mainloop ______________________________________________________________________ 11.4. キャンバス上にどのようなものが描画できますか? arc sections of circle bitmap for X11 bitmap files/builtins image for Photo image types (gif, xpm, xbm, ...) line oval includes circles polygon may be -filled rectangle may also be -filled text similar to Text widget primitive window allows embeddding of other widgets 11.5. キャンバス上に線を再描画するには? ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" def push_it(line) line.coords 0, 0, 100, 100 end c = TkCanvas.new i = TkcLine.new(c, 0, 0, 50, 50) c.pack TkButton.new { text 'extend' command proc { push_it i} }.pack Tk.mainloop ______________________________________________________________________ 11.6. キャンバスのデータを PostScript(c)に出力するには? ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" min_x = 0 min_y = 0 c = TkCanvas.new i = TkcLine.new(c, 0, 0, 50, 50) c.pack ps = c.postscript('x' => min_x, 'y' => min_y, 'width' => c.cget('width'), 'height' => c.cget('height')) f = open('file.ps', 'w') f.print ps f.close Tk.mainloop ______________________________________________________________________ 11.7. キャンバスの大きさを表示するには? リサイズ後は? canvas.cget('width') 12. 共通した問題 12.1. => とか . とかの意味は? => は Hash . はメソッド 12.2. カーソルやカラーを変えるには? 基本的には、 widget.configure('cursor' => ...) 12.3. ベルを鳴らすには? 簡単には、 widget.bell スクリプトで例を書くと、 ______________________________________________________________________ #!/usr/local/bin/ruby require "tk" button = TkButton.new { text 'Bell' command proc{ self.bell } }.pack Tk.mainloop ______________________________________________________________________ 12.4. 実行時に ruby や、ruby/tk や、Tcl/Tk のバージョンを知るには? ruby VERSION ruby/tk ない? Tcl Tk::TCL_VERSION Tk Tk::TK_VERSION 日本語化? Tk::JAPANIZED_TK 13. Tcl/Tk と ruby/tk との違いは? what Tcl/Tk ruby/Tk variable set a 123 a = 123 or a = '123' initialization re-assignment set b $a b = a lists/arrays set a {1 2 fred 7.8} a = [1, 2, 'fred', 7.8] re-assignment list set b $a b = a associative set a(Jan) 456.02 a = {'Jan' => 456.02, 'Feb' => 534.96} arrays set a(Feb) 534.96 re-assignment foreach i \ b = a [array names a] { set b($i) = $a($i) } expressions set a [expr $b+$c] a = b + c increment incr i i += 1 declare proc plus {a b} { def plus(a, b) subroutines expr $a + $b } return a + b end variable scope local default local default override w/ "global" call plus 1 2 plus(1,2) subroutines statement sep newline or at ";" newline or at ";" statement "\" - newline none required continuation verbatim strings {} '' e.g. {a \ lot@ of $stuff} 'a \ lot@ of $stuff' escaped strings "" "" e.g. "Who\nWhat\nIdunno" "Who\nWhat\nIdunno" STDOUT puts "Hello World!" print "Hello!\n" puts stdout "Hello!" $stdout.print "Hello World!\n" 14. どうやって新しいスクリプト、モジュール、拡張を入れたら良いの? スクリプト 普通の ruby スクリプト同じに モジュール どういったのに相当するのかな? Extensions どういったのに相当するのかな? 15. どうやって新しいモジュールを書けば良いの? Perl/Tk と違って、現在の ruby/tk は、Tcl/Tk 非依存でないので、 C で、 ごりごりモジュールを書くことはない? tcltk-ext 使用して、Tix, BLT とか整備したいなああと、expect も 16. 複合 Widgets について 複合 Widgets とは、pure な Tcl/Tk が持っている widget や ruby/tk のク ラスを組み合わせて、100% pure ruby/tk widget を作ったもの (^^; ライブ ラリの tkscrollbox.rb が、例らしいです。 [ruby-list:5610] [ruby-list:5611] で、解説されています。 16.1. ダイアログボックスありますか? TkDialog クラスというのがあります。使い方は、Ruby_Tk-widget-demo を参 照のこと 16.2. ファイル選択は? ある。使い方は、Ruby_Tk-widget-demo の filebox.rb を参照のこと 16.3. カラーエディターは? Ruby_Tk-widget-demo の色選択ダイアログを改造すれば? Perl/Tk のモジュ ールにこういうのがあるのか? 16.4. tkerror に相当するものは? ruby に備わっている 例外処理以外にあるのかな? 16.5. テーブルはありますか? 100% pure ruby/tk な、テーブル クラスはない tcltk-ext を使って BLT を呼び出せば実現できると思う。また は、Tktable とか。 17. プログラミング開発ツール ruby の起動オプションに -w をつけて起動? 17.1. Tcl/Tk から ruby/Tk へのコンバータありますか? 今のところありません 17.2. ruby/tk 用のデバッガってありますか? ない? 17.3. ruby/tk に GUI ビルダーありますか? ない 18. どうやったらスクリーンをクリアできるの? 19. ruby/tk の中で X アプリケーションを描画? 20. Microsoft Windows(tm) でも使えますか? 使えます。 Windows95 Tcl7.6jp/Tk4.2jp + ruby??? で起動を確かめました o Cygwin版 Tcl7.6jp+Tk4.2jp OK? Tcl8.0.x+Tk8.0.x OK? Tcl8.1.x+Tk8.1.x OK? Tcl8.2.x+Tk8.2.x OK? o mswin32版 Tcl7.6jp+Tk4.2jp OK? Tcl8.0.x+Tk8.0.x OK? Tcl8.1.x+Tk8.1.x OK? Tcl8.2.x+Tk8.2.x OK? 21. ruby/tk では、日本語使えるの? 日本語化された Tcl/Tk を入れていれば、日本語が使えるはずです。 (Windows で、日本語化されていないTcl/Tk 8.x 系はどうなんだろう?) 22. ruby から使えるツールキットって他にありますか? EZWGL モジュール EZWGL を扱うモジュールが 前田さんによって作られています。現在ネットワーク上では手に入らな いかも? FLTK モジュール FLTK を扱うモジュールを立石さんによっ て作られています。立石さんWeb から手にいれることができます。 gtk モジュール gtk を扱うモジュールがまつもと さんによっ て作られています。現在は、五十嵐さんがメンテしています。 contrib/ にあります XForms モジュール XForms を扱うモジュールが立 石さんによって作られています。 contrib/ にあります Xtoolkit モジュール Athena widget や Motif を扱うモジュールが前田さんによって作られ ています contrib/ にあります XView モジュール XView を扱うモジュールが立石さんによって作られています contrib/ にあります Xlibモジュール Xlib を扱うモジュールがもりきゅうさんによって作られています Moriq Ruby にあります 23. どこで、グラフィックス関連の情報を得られますか? GD モジュール GIF ライブラリである(最近はPNGライブラリになっちゃった) GD が ruby から使えます contrib/ にあ ります Open, Mesa-GL モジュール contrib/ にあります 24. ruby/tk で書かれた主なアプリケーションは? Ruby_Tk-widget-demo 永井氏らによる Tcl/Tk の widget demo の ruby/tk 版です。 contrib/ にあります emie あ伊藤氏作のメールリーダです。 contrib/ にあります mine 前橋氏作のテキストエディタです。 contrib/ にあります Othello game 前田氏作のオセロゲームです。現在ネットワーク上では手に入らないか も? SGmail 鴫原氏作のメールリーダです。 SGmail か ら手にいれることができます。 hanoi Python のデモをコンバートしてみました [ruby-list:6616] から手にいれることができま す。 箱入り娘 「箱入り娘」tk版です。 I like Ruby から手にいれることがで きます。 TKCAL ふなば氏作のカレンダーです。 Ruby から手にいれることがで きます。 25. ruby/tk の歴史は? o tk 相当前から o tcltklib 1997 Sep. o tcltk-ext o tcltklib, tk に 26. 将来 27. どうやったらこの FAQ の最新バージョンを手に入れられるの? 未定 28. 謝辞 ruby の作者である まつもと さん Tcl/Tk の作者である John K. Ousterhout 博士 ruby-list ML で私の幼稚な質問に答えてくださった方々 その他 ruby/tk を使用している人々