RubyでマルチプラットフォームなGUIアプリを作ってみる

Rubyを使いWindowsでもLinuxでも動くGUIアプリケーションを作ってみたい。作るアプリケーションは、引数としてプログラムパスを受け取り、一定時間経過後そのプログラムを実行するというシンプルなものにする。起動したらダイアログを表示し、カウントダウンタイマ付のボタンを用意する。ボタンは「はい」と「いいえ」とし、引数でタイムアウト時のデフォルト処理をしていする。タイムアウトすればデフォルトの処理が動き、ユーザがボタンをクリックすれば、希望の動作を行うようにする。GUIライブラリはtkを使う。

WindowsにRubyをインストール

ここからruby-1.9.1-p0-i386-mswin32.zipをダウンロード、C:\Ruby\に展開した。libフォルダのなかにtkがあるのでtkをインストール必要はないのだろう。

簡単なGUIプログラムが動くかテストしてみる。ここを参考に以下のようなファイルHello.rbを作る。

コマンドプロンプトを開き、実行してみるとまずいかのようなメッセージボックスがでた。

---------------------------
ruby.exe - DLL が見つかりません
---------------------------
ダイナミック リンク ライブラリ tk84.dll が指定されたパス c:\Ruby\bin;.;C:\WINNT\system32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32
に見つかりませんでした。
---------------------------
OK
---------------------------

コマンドの出力は以下のようなものだった。

C:\Work\Ruby>c:\ruby\bin\ruby hello.rb
c:/ruby/lib/ruby/1.9.1/tk.rb:6:in require': 126: 指定されたモジュールが見つかり
ません。 - c:/ruby/lib/ruby/1.9.1/i386-mswin32/tcltklib.so (LoadError)
from c:/ruby/lib/ruby/1.9.1/tk.rb:6:in
'
from hello.rb:3:in require'
from hello.rb:3:in

'

C:\Work\Ruby>

126というのはおそらくGetLastError()の戻り値だろう、そしてtcltklib.soは存在するので、これをLoadLibrary()したとき依存するtk84.dllが読めないということ?

tk.rbはあくまでtkを使うためのラッパーであってtkそのものはインストールしなければならないということだと思うのでここへ行ってActiveTCLをダウンロードする。といってもエラーはtk84.dllで出たので同じバージョンをダウンロードしよう。「Other System and Version」をクリックしてActiveTcl8.4.9.1.139183-win32-ix86.exeをインストールした。リブートご再び実行すると、以下のように起動できた。

hello

これで作り始める準備が整った。ここで作るのは最初に書いたように以下のようなイメージのアプリだ。

ところがここで問題が。Rubyスクリプトファイルをいくら書き換えても、最初に実験したHello.rbの内容が表示される。以下のような1行だけのファイルでも実行される。

Rubyのことはまだよくわかっていないが、これは何かのバグだろうか?どっかにキャッシュが残っているのだろうか?ググってもよくわからない。仕方ないのでいったんActiveTCLをアンインストールしもっと古いヴァージョンを使ってみる。

ActiveTcl8.4.17.0.283511-win32-ix86-threaded.exeをダウンロード、インストールし、リブートした結果、以下のように正常に動くようになった。

okn

よくみるとWindowsの場合と違ってクライアントエリアにもHello World!の表示がある。Windowsの方はインストールに失敗があったのだろうか?

よってWindowsはここで止めてFedora10に移る。rubyはインストールしてあるので以下のようにtkをインストールした。

# yum install ruby-tcltk

次に上のHello.rbを実行してみる。
screenshot-hellorb
実行できた。

あとは頑張って以下のプログラムを書いてみた。多分いい加減なところがいっぱいあるだろうが。

アプリの起動にはsystemメソッドを使っているが、これを使うと起動したアプリが終了するまで戻ってこなくなる。が、まぁいいや。以下のように実行できた。

$ ruby rubytk.rb gedit

screenshot-rubytkrb

C:\T>c:\ruby\bin\ruby.exe -Ku rubytk.rb notepad

tkwin

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)