数年前に Ruby 1.8 で作ったアプリImageSpiderが動かなくなったとの報告を受け、直そうとするも Ruby はもう 2.3 とかなんだそうで。
とりあえず Ruby 1.9.3 にしたけど
お気に入りだったGUIライブラリwxRubyは更新が止まっているわ、非同期処理が前と同じやり方で動かないわ、他にしっくりくるGUIライブラリがないわ。
仕方なく見た目が嫌いで一度捨てた Ruby/Tk を使うことに。
いくらか工夫すると少しはましになった。
ポイントを書き残しておく。
ocra用のrequire
以下のような相対パスでのrequireはocraでexeファイルにした時に読み込みに失敗してしまう。
require './script'
以下のように書き換えた。
require File.expand_path(File.join(File.dirname(__FILE__), './script'))
いや、日本語を含むパスだと失敗するのでこうか。
require File.expand_path(File.join(File.dirname(__FILE__), './script').encode(__FILE__.encoding))
と思ったらいいものがあった。
require_relative './script'
Ruby/Tkでのウィンドウのアイコンの設定
Medfreak / Ruby/Tk タイトルバーのアイコンを変更する how to change the window icon using Ruby/Tkを参考に、更に、前述の手法で、ocraで同梱したアイコンファイルを読むように。
root = TkRoot.new iconFilePath = File.expand_path(File.join(File.dirname(__FILE__), './icon.ico').encode(__FILE__.encoding)).encode(Encoding::UTF_8) Tk::Wm.iconbitmap(root, iconFilePath)
Ruby/Tkでのウィンドウのタイトルの設定
Tk.root.title("タイトル")
Ruby/Tkでのパディングの設定
Ruby/Tkのサンプルを見ると、大体が隙間なくコントロールが敷き詰められているのだけど、パディングを設定するとだいぶ印象が変わる。以下の「padx」「pady」の部分。
あとはframeやgrid等を使って丁寧にレイアウト…。
@downloadButton = TkButton.new { text "ダウンロード" command dl grid(row: outerRow, column: 0, sticky: :e, padx: 4, pady: 5) }
ocraでのEXEファイルの作成
最終的には以下のようなコマンドになった。
ocra script.rb --windows --no-autoload --icon icon.ico --output application.exe C:\Ruby193\lib\tcltk\ icon.ico
- 「--windows」でコマンドプロンプトウィンドウ表示無しに。
- 「--output」で実行ファイル名を指定。
- 「--icon」で実行ファイルのアイコンを指定。
- Ruby/Tkのファイル一式を同梱
- アイコンファイルを同梱
- 「--no-autoload」は理解できていないのだけど、指定しないと以下のエラーが出たので…。
C:/Ruby193/lib/ruby/1.9.1/tk/console.rb:13:in `_create_console': interpreter is deleted (RuntimeError)
できあがり
以下みたいな感じに。