てけとーぶろぐ。

ソフトウェアの開発と、お絵かきと、雑記と。

Ruby 1.9.3 + Ruby/Tk + ocra でWindowsデスクトップアプリ作成

数年前に 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)

できあがり

以下みたいな感じに。

f:id:kurimayoshida:20160320234315p:plain