Gtk+ DataBinding

明日から仕事始めなのでと覚書ページ書き換えラストスパート。
GtkSwitch を試していて困った。

GtkSwitch

activate シグナルがあるけど connect しても発行されない。
but use the notify::active signal.
なんて書いてあるから当然なんだけど、どう使うの?
さて今日も英語と格闘が始まるな。

Short Example of GSettings Bindings with Python using a Gtk Switch ? Mariano Chavero

なるほど、こうやって使うのか。
GNOME3 環境の人しか実験できないサンプルだけど on off でデスクトップアイコンの表示切り替えができるのを確認した。
しかも dconf-editor で切り替えたら GtkSwitch も切り替わる双方向。

つまり Widget のプロパティと GSettings はバインディングできるんだね。
それなら Widget 同士でもやれそうだと思ったので調べてみる。
というか GSettings のサンプルだと GNOME3 以外を使っている人には解らないし。

GBinding

g_object_bind_property という関数で Widget 同士のバインドもできそう。
PyGI で GObject.Binding 内を探すが見当たらない。

GObject-2.0 Python API Documentation

うーんココには有ると書いているんだけど。
って URL をよく見たら ubuntu-12.10 だ、つまり Fedora17 より新しい。
仮想 Ubuntu 12.10 を立ち上げ dir してみる。

bind_property

あぁやっぱり。
しかたがない、今は仮想 Ubuntu 上で試してみるか。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

"""
    Widget Property Binding Sample
"""

from gi.repository import GObject, Gtk

switch = Gtk.Switch()
check = Gtk.CheckButton("Check")
GObject.Binding.bind_property(
        switch, "active",
        check, "active",
        GObject.BindingFlags.BIDIRECTIONAL )

hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
hbox.pack_start(switch, False, False, 0)
hbox.pack_start(check, False, False, 0)

w = Gtk.Window()
w.add(hbox)
w.connect("delete-event", Gtk.main_quit)
w.show_all()
Gtk.main()

widget_property_binding

GBindingFlags は
GObject.BindingFlags.DEFAULT では source 側からの一方向バインド。
GObject.BindingFlags.BIDIRECTIONAL で双方向になる。
他2つはよく解らない、上記2つあれば充分だし。

こんな感じでデータと GUI を結びつければ面白くなるね。
WPF の ObservableCollection みたくできるかも、アレは混乱の元だが。

しかし早く fedora 18 出ないか、今日サイトを見たら又伸びているんだが…