Fedora 15 を使っていて GTK+3 をやらない人は何故 Fedora を選んだのだろう。
なんて思っていたけど GNOME 3 の UI は GTK+ だけでは無いようだ。
Clutter って何だろう。
OpenGLを利用するマルチプラットフォーム対応GUIツールキット「Clutter 1.0」リリース – SourceForge.JP Magazine : オープンソースの話題満載
ようするに Windows の WPF みたいなものかな。
Python からでも使えるようなので試してみよう。
Clutter の所をクリックして coocbook に辿り着く。
まあ当然のごとく C 言語での解説しか無いので Python では自力で漁る。
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys from gi.repository import Clutter def quit(widget): Clutter.main_quit() init = Clutter.init(sys.argv) if init[0] == Clutter.InitError.SUCCESS: stage = Clutter.Stage() stage.connect("destroy", quit) stage.show() Clutter.main()
Python with GTK+ 3 をやったのと同じ感覚で Window が作れた。
Clutter.init は何故かタプルを戻すので最初の値で初期化エラーの確認を行う。
destroy に直接 main_quit を指定すると例外になるので注意。
ExamplePython – ClutterProject
こんなページも見つけたけど Clutter.Stage だけで Window になる。
2. Drawing a shadow under the text
上記をやろうと思ったけど cogl-pango の import 方法が解らない。
でも WPF みたいなものなら opacity で調節してズラしたものを重ねればいいんでない。
5. Making an actor respond to button events
この四角形を利用したボタンもついでに。
#!/usr/bin/env python #-*- coding:utf-8 -*- import sys from gi.repository import Clutter class TestStage(Clutter.Stage): def __init__(self): Clutter.Stage.__init__(self) # Color red_full = Clutter.Color.new(0xff, 0x00, 0x00, 0xff) red_half = Clutter.Color.new(0xff, 0x00, 0x00, 0x77) blue = Clutter.Color.new(0x00, 0x00, 0xff, 0x3f) # Text self.text1 = Clutter.Text.new_full("Sans 128px", "Text", red_full) text2 = Clutter.Text.new_full("Sans 128px", "Text", red_half) text2.set_position(6, 4) self.add_actor(self.text1) self.add_actor(text2) # Button (rectangle) rect = Clutter.Rectangle.new_with_color(blue) rect.set_size(100, 100) rect.set_position(20, 30) rect.set_reactive(True) rect.connect("button-press-event", self.on_click) self.add_actor(rect) # self self.connect("destroy", self.quit) self.set_title("Clutter Test") self.set_size(300, 200) self.show_all() def quit(self, widget): Clutter.main_quit() def on_click(self, actor, event, user_data=None): if self.text1.get_text() == "Text": self.text1.set_text("Click") else: self.text1.set_text("Text") if __name__ == '__main__': init = Clutter.init(sys.argv) if init[0] == Clutter.InitError.SUCCESS: TestStage() Clutter.main()
なるほど、やっぱり DirectX 描写の WPF みたいなものだね。
OpenGL 描写の部品を重ねたり直接コールバックを指定できたりで面白い。
でも Button とかの widget クラスは用意されていないみたい。
というか、そういう使い道では無いんだろうね、機会があったら利用しよう。