古いコンテンツの覚書のページ書き換えをヤルヤル詐欺していた。
放置しすぎてもう古さ全開なのでと先週から地味に整理中。
この年末年始休暇の内になんとか整理を終わらせたい。
ウインドウを作る – L’Isola di Niente
ダイアログを作る – L’Isola di Niente
コレのために Glade を何年かぶりに入れたりしたけど特にネタも無かった。
Glade を使ったページは削除で済ませることにしよう。
次は DrawingArea を、PyGtk と共通点がゼロなんだよなココ。
expose-event が draw に変わって cairo_t を使えだもんな。
しかし困った、Fedora 17 では下記 PyGI コードが動かない。
というか draw のシグナルが発生しない。
原因判明、同一ディレクトリに cairo.py なんて名前のファイルを入れていたので上書き扱いになり cairo.Context が見つからず変換できないエラーでシグナルが作成できなかっただけだった…
消したら普通に動いた…
Python with GTK+3.0 Create GtkPixbuf | PaePoi
GTK+ 3.4 自体がおかしいのか gir がおかしいのかな。
Boxes 上の仮想 Ubuntu は GTK+3.6 なのでソッチで動かしてみる。
問題なく動く、こりゃココの整理は Fedora 18 待ちか。
せっかくなので Vala で同じコードを書いてみた。
PyGI では入れていなかった画像が無かった場合の例外処理も入れて。
以前書いた MessageBox.Show() の使い方サンプルも兼ねて。
using Gtk; using Gdk; //Pixbuf /* * build command * valac --pkg gtk+-3.0 test.vala * `--pkg gdk-2.0` Not required */ public class Win : Gtk.Window { private Pixbuf pixbuf; private DrawingArea drawing_area; public Win () { this.set_title("draw test"); this.destroy.connect (Gtk.main_quit); // DrawingArea drawing_area = new DrawingArea(); drawing_area.draw.connect(on_drawing_area_draw); try { pixbuf = new Pixbuf.from_file("madoka.jpg"); } catch (Error e) { MessageBox.Show(e.message); } this.add(drawing_area); this.show_all(); } private bool on_drawing_area_draw(Cairo.Context cr) { // set picture if (pixbuf != null) Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0); // Arc int width = drawing_area.get_allocated_width(); int height = drawing_area.get_allocated_height(); cr.arc( width / 2.0, height / 2.0, int.min(width, height) / 2.0, 0, 2 * Math.PI); cr.fill(); return false; } public static int main (string[] args) { Gtk.init(ref args); new Win(); Gtk.main(); return 0; } } public class MessageBox { public static ResponseType Show (string text) { var dlg = new MessageDialog( null, DialogFlags.MODAL, MessageType.ERROR, ButtonsType.OK, text ); dlg.set_title("Message"); var res = dlg.run(); dlg.destroy(); return (ResponseType)res; } }
Vala では GdkPixbuf.Pixbuf ではなく Gdk.Pixbuf なんだね。
gir って実はよく解っていないけど動的と静的で違うのか。
PyGI では GLib.PI だったのが GLib.Math.PI だったりとか思ったより迷う。
min 関数は int.min() とかって何だよ…
ほとんど同じだけど実は細かく違うのね。
このコードは PyGI っぽくハンドラを書いたけどハンドラに GtkWidget 部を入れられないのでクラス変数を使うしかなく少し面倒、公式サンプルのように書いた方がローカル変数が使えて楽かと。
pkg 指定が Gtk+-3.0 だけでイケたのがちょっと奇妙。
とりあえず GTK+ 3.4 環境でも Vala なら問題なく draw シグナルが使えるってことですね。
しかし古いページはたった三年前に書いたとは思えない古臭さだ。
又あと三年たったら…考えないようにしよう。
最近の Linux は進化が早すぎて怖い。
アプリケーションの.NET Framework 4.5への移行: 廃止された型と新しい型
とはいえ .NET に比べたら楽なもんだ。
969 の新しい public 型なんて吐き気しかしない、Linux へ早めに逃げて良かった。
.NET 関連の tips も削除しといたほうがいいのかも。