clutter学习笔记三(不是教程,请不要骂人)
Tofloor
poster avatar
z85525006
deepin
2012-02-05 06:59
Author
笔记作的不是很完整,都是从网上整理出来的!请大家不要喷我.,
==============================
容器: groutp很重要的东西,可以看clutter官方的python的例子,慢慢看哈!哈哈哈... ...
一些 clutter actor 实现了 Clutter.Container 接口,这些 actor 可以包含自己的子 actor。另外,变换 (transformation)和属性改变也作用于子 actor 。用 clutter.container.add() 函数将 actor 加到 container 中
Clutter.Stage 就是一个 container,可以包含自己的 actor。Clutter 核心库里另一个 container 是 Clutter.Group,对于 group 的缩放、旋转和剪切也会作用于子 actor,这会简化代码。
其它 Clutter container 可以在 Tidy toolkit library 中找到。
========================================================
例子:
  1. #!/usr/bin/env python
  2. #!^-^ coding:utf-8 ^-^
  3. import clutter
  4. class Clutter:
  5.     def __init__ (self):
  6.         self.stage_color = clutter.Color(0x00, 0x00, 0x00, 0xff)
  7.         self.actor_color = clutter.Color(0xff, 0xff, 0xff, 0xB0)
  8.         
  9.         self.stage = clutter.Stage()
  10.         self.stage.set_size(350, 350)
  11.         self.stage.set_color(self.stage_color)
  12.         self.stage.connect("destroy", clutter.main_quit)
  13.         
  14.         self.group = clutter.Group()
  15.         self.group.set_position(40, 40)
  16.         self.stage.add(self.group)
  17.         
  18.         self.texture = clutter.Texture("linux.png")
  19.         self.texture.set_position(150, 100)
  20.         self.group.add(self.texture)
  21.         
  22.         self.label = clutter.Text("Mono 14", "欢迎加入深度", self.actor_color)
  23.         self.label.set_position(150, 240)
  24.         self.group.add(self.label)
  25.         
  26.         self.stage.connect("button-press-event", self.on_stage_button_press)
  27.         self.stage.connect("button-release-event", self.on_stage_button_release_event)
  28.         
  29.     def run(self):
  30.         clutter.Actor.show_all(self.stage)
  31.         
  32.     def on_stage_button_press(self, stage, event):
  33.         self.texture.set_scale(3.0, 1.0)
  34.         return True
  35.     def on_stage_button_release_event(self, stage, event):
  36.         self.texture.set_scale(1.0, 1.0)
  37.         return True
  38. if __name__ == '__main__':
  39.     app = Clutter()
  40.     app.run()
  41. clutter.main()
Copy the Code
========================================================
事件:
基类 ClutterActor 有几个信号,当用户与 actor 交互时信号会被发出:
button-press-event: 当在 actor 上按下鼠标时发出;
button-release-event: 当在 actor 上释放鼠标时发出;
motion-event: 当在 actor 上移动鼠标时发出;
enter-event: 当鼠标移入 actor 区域时发出;
leave-event: 当鼠标移出 actor 区域时发出。
例如,可以这样检测在一个 actor 上点击了鼠标:
****.connect ( "button-press-event", 回调函数)
另外,也可以仅仅处理来自 parent ClutterStage 的信号,然后用clutter.Stage.get_actor_at_pos() 找出信号来源于哪个 actor。
然而,从性能优化上考虑, Clutter 默认状态下不会发送所有的事件信号。例如,要收到 actor 的事件信号,而不仅仅是 stage,必须调用 clutter.Actor.set_reactive()。
通过捕获事件信号 (captured-event signal),Clutter 首先让 stage 处理每个事件。 若 stage 不处理这些事件,那么事件会被传递给 child actor;事件首先被传递给 actor 的 container,若 container 仍然不对出事件进行处理,那么事件将会以特殊信号 (比如 button-press-event 或者 key-press-event) 的方式发送。这些特殊信号首先由 child actor 发出,然后是它的 parent,其次是stage,除非有信号处理函数对信号进行处理并返回 true。
当 actor 有按键焦点时,它通常只收到键盘事件。
===================================================================
例子:
  1. #!/usr/bin/env python
  2. #! coding:utf-8
  3. import clutter
  4. import gtk
  5. class Clutter():   
  6.     def __init__(self):
  7.         stage_color = clutter.Color(0x00, 0x00, 0x00, 0xff)
  8.         self.actor_color = clutter.Color(0xff, 0xff, 0xff, 0xB0)
  9.       
  10.         self.stage = clutter.Stage()      
  11.         self.stage.set_size(200, 200)
  12.         self.stage.set_color(stage_color)
  13.         #换张图片试试 Texture('linux.png')
  14.         self.rect = clutter.Rectangle()
  15.         self.rect.set_size(100, 100)
  16.         self.rect.set_position(50, 50)
  17.         self.rect.set_color(self.actor_color)
  18.         
  19.         self.stage.add(self.rect)
  20.         self.stage.connect('destroy', clutter.main_quit)
  21.         self.stage.connect('button-press-event', self.on_stage_button_press)
  22.         #actor的事件缺省是不开启的.为了提高性能可关闭移动鼠标的触发
  23.         self.rect.set_reactive(True)
  24.       
  25.         #当在actor上按下 鼠标时发出
  26.         self.rect.connect('button-press-event', self.on_actor_button_press)
  27.         #当在actor上释放 鼠标.....
  28.         self.rect.connect('button-release-event', self.on_actor_button_release)
  29.         #当在actor上移动鼠标时发出
  30.         self.rect.connect('motion-event', self.on_actor_motion_event)
  31.         #当鼠标移入actor区域时发出
  32.         self.rect.connect('enter-event', self.on_actor_enter_event)
  33.         #当鼠标移出actor区域时发出
  34.         self.rect.connect('leave-event', self.on_actor_leave_event)
  35.       
  36.     def run(self):
  37.         clutter.Actor.show_all(self.stage)
  38.    
  39.     #当按下actor的时候,stage也被触发.所以可以想像...
  40.     def on_stage_button_press(self, stage, event):
  41.         print 'stage按下鼠标'
  42.     def on_actor_button_press(self, rect, event):
  43.         print 'actor你按下了--鼠标'
  44.         self.actor_color = (0xff, 0xff, 0xff, 0xE0)
  45.         self.rect.set_color(self.actor_color)   
  46.         return True
  47.     def on_actor_button_release(self, rect, event):
  48.         print '你放开了|鼠标(actor)'
  49.         self.actor_color = (0xff, 0xff, 0xff, 0xA0)
  50.         self.rect.set_color(self.actor_color)
  51.         return True
  52.     def on_actor_motion_event(self, rect, event):
  53.         print '鼠标移动(actor)中' + str(event.x) + ':' + str(event.y)
  54.         return True
  55.     def on_actor_enter_event(self, rect, event):
  56.         print '你(actor)移进来了!!'
  57.         self.rect.set_scale(1.2, 1.2)
  58.         return True
  59.     def on_actor_leave_event(self, rect, event):
  60.         print '(actor)移出去了'
  61.         self.rect.set_scale(1.0, 1.0)
  62.         return True
  63. if __name__ == '__main__':        
  64.     app = Clutter()
  65.     app.run()
  66.    
  67. clutter.main()
Copy the Code


======================================================================
Reply Favorite View the author
All Replies

No replies yet