Ruby Gtk で遊ぶ

(この記事はメモ書きの状態です)(そのうちまとめるかも知れませんが、当分はゴチャゴチャです)

Github 公式サンプル
https://github.com/ruby-gnome2/ruby-gnome2/tree/master/gtk3/sample/misc

Ruby/GTK でよかったこと

・Linux でもGUIがきれい!
・Webkitが使えるのでウェブページが表示できる
・gem install でパスワードを求められ、パッケージがインストールされるという新鮮な体験がある
・PDF も表示できる
・Glade が便利
・メンテナンスがしっかりしている

Ruby/GTKの微妙なところ

・C言語のバインディングなので、メソッド名がRubyっぽくない。特に signal_connect
・Ruby/Tk や Shoes では省略されるようなことも細かく書く必要あり
・ブロックをあまり使わない
・GIO yard server -g で勉強しにくいので Gnome の資料をみる必要あり
・日本語ドキュメントが古い

Ruby/Tk の方がよいところ

・手軽で普及率が高い
・Windowsでの動作に一定の安心感があった
・比較的充実した資料(比較対象がどれも…という感はある
・GUIライブラリの中でRubyっぽいかわいい感じのする書き味

GTKとは何か

わからないものを、わからないなりに理解しようとすることは大事だ。
Wikipediaによると、元々はGTKは、GIMPの実装のために開発されたツールキット。


https://ja.wikipedia.org/wiki/GTK%2B#/media/File:Free_and_open-source-software_display_servers_and_UI_toolkits.svg

なにやってんのか全くわからん部品がたくさん。とりあえずいい加減に理解。

glibc: Gnu標準のCライブラリ
GLib: 異なるOS間、CPU間の移植性を確保するライブラリだと。
GObject: Cでオブジェクト指向するためのやつっぽい。GTK+ 2.0 リリースの際に分離された。Wikipediaによるとサブクラスを作成するだけで数百行もコードが必要になるという。
D-Bus: プロセス間通信だって。
avahi:ネットワークに接続したとき、即座にプリンタを検出するやつらしい
X-Server: ssh -Xでアクセスするやつ。
Wayland: X-Serverじゃなくて、直接画面を描写して早いやつっぽい。2008年と最近。

GTKが保守的ってことは何となくわかる。FirefoxとかThunderbirdとかもっさりしているけど、ちゃんと動く。Ubuntu も Unity から GNOMEに戻ったし。

GTKとruby/GTK

GTKのレポジトリとか
https://gitlab.gnome.org/GNOME/gtk

ruby-gnome2
https://github.com/ruby-gnome2/ruby-gnome2

インストール

コントリビュータはktou氏がほとんど。
公式ドキュメントは情報古い。

atk: アクセッシビリティ
pango: テキストのレンダリング、汎語?
GdkPixbuf: ピクセル単位で画像扱うやつ
GObjectIntrospection: introspection内省、内観、自己反省
https://qiita.com/groonga/items/71b145b37d77bd160bf2
C言語で書かれたライブラリーを各種スクリプト言語から言語バインディングを書かずに使える機能を提供するライブラリーです。とのこと。

Cairo: Xに依存しないライブラリ。Geckoとかに使われてるらしい。PDFやSVGにも出力。
Gstreamerってなんやろ。よく見るけど。
Clutter is an OpenGL-based ‘interactive canvas’ library

チュートリアル以前

https://github.com/cedlemo/ruby-gtk3-tutorial のチュートリアルやってみる

ウィンドウ出す

delete-event つけないとウィンドウ消してもプロセス残る。

ボタンつける

ボタンに機能をつける

空のウィンドウをだすアプリ

ボタン押すとウィンドウ閉じるやつ

配置の方法

配置の仕方はRuby/Tkでもいろいろあって、完全には理解していない。Gtkはもっと大変そう。
Gtk::Box
Gtk::Grid
Gtk::Fixed
あたりが基本っぽい。

グリッドによる配置

UIをxmlファイルに分けて記述

Gladeの使い方を覚える話になってくると、何となく頭の違う部分使ってる気がする。
このままGTKの機能を見ていくと、多分面白くなくなっちゃうのでウィジェットを色々動かしてみる。

カレンダーの表示

ダイアログを出す

ファイル選択ダイアログ

GladeというのでGUIを作成すると便利であると。便利そうだが、どこにどんなツールがあるか覚えないと使えない。

画像を表示する

テキストウィジェット

図形を描写したりするやつ

Cairoを使用するみたい。

リストボックス的ななにか

Gladeの暴走

理由はわからないが、Gladeが暴走することが結構ある気がする。何が悪いのかよくわからない。

簡易Webブラウザ

簡易Webブラウザ(Glade使ったやつ)

資料みっけ

PDFの1ページ目を表示するやつ

やっぱり、Webサイトの表示とか、PDFの表示とか、Ruby/Tkでやりたかったけどできなかった事が簡単にできて嬉しいわけです。

Gladeでのツールバーの作り方 資料

https://developer.gnome.org/gnome-devel-demos/stable/toolbar_builder.py.html.en
コードを一切書かなくてもそれなりにツールバーが作れちゃうので便利なのはわかるけど、ウチの環境だと高確率でGladeが暴走する。
他所ではGlade安定しているんだろうか。

最小限ターミナル

GTKソースコード見るやつ

Gtk2 と Gtk3 で微妙にネーミングが変わってるから注意。
Ruby/Tk が懐かしいので、tapを使って Ruby/Tk っぽい見た目にしてみた。
こっちの書き方の方が良いとは限らないんだけど、なんとなくそれっぽさがある。
GtkにはGlade先生がついているから、こんなGUIの入れ子関係を模倣したネストなんか要らないんだけどね。

キーバインドを拾う

ループ処理を行う

GLib::Timeoutを使う

GStreamerが難しい

せっかくRuby/TkではなくてRuby/GTKなので、音楽やビデオを再生したいのだが、GStreamerがよくわからなくて困る。GStreamerといえば、darknetで使うOpenCVをインストールするときにエラーを生じがちなアレというイメージ。



難しい、難しいと思っていても、時間をかけて眺めているとある程度わかってくることも多いので今日はこんな感じ。

最小限mp3再生Gstreamer

結局Gstreamerが何なのかはよくわからず。ひとまずplaybinを使うとmp3再生できた。他の形式も再生できて便利。

webm形式や、ogg形式のビデオもこれで再生できるようだ。mp4は音だけ出ている。
gstreamerはsynapticでパッケージ検索するだけでも大量にヒットするし、追加のパッケージを色々インストールすれば、mp4のビデオも再生できるのかも知れないが、よくわからない。

クリアコード謹製の資料
http://www.clear-code.com/blog/2014/7/22.html

テキストビューの内容を通知するやつ

チュートリアルを読んでみた

glib-compile-resources でリソースをコンパイルできる。またGIOで、それらにアクセスできる。しかしRuby/Gtkでちょっとした個人ツールでは、ファイルのパスを直接するので十分だろう。Ruby/Gtkで作ったものを配布する場合にも便利かもしれないが、Ruby導入の時点で面倒なのでメリットは小さい。

type-register ガシガシとサブクラスを作成して既存のウィジェットをカスタマイズする方法で作る時に、自作のサブクラスをGTypeとして登録するためにメソッドのようである。初心者なので、サブクラスというややこしいものは、なるべく作りたくない。作ったウィジェットが一つ一つクラスに対応していたらカチッとしていて心地良いだろうけど、Rubyのクラスの世界と、GTKの型の世界の2つの世界に気を使うのは面倒くさそうだ。GladeでComposite(複合)という項目をチェックするらしい。

set_template で .ui ファイルを指定する。
bind_template_child でアイテムを呼び出せるようにする。

gschemaでセッティングを保存できる。glib-compile-schemas でコンパイル。Gio::Settings.new で呼び出し。これも知識としては知っておくが、使う機会はあるのかな…。GIOのリファレンスをざっと見ていてもたくさん機能があるようだ。

感じたのは、英語がつらい。yard server -g によるお気軽な勉強方法が使えないので、Gnomeの情報やPygobjectの情報から勉強していくしかないけど、基本的には英語の情報に当たるしかないようだ。趣味でポチポチやってるだけの人にはつらいところだ。。