2012-02-05 3 views
3

GtkClutter를 사용하여 응용 프로그램을 작성하려고하는데 액터에서 신호를받을 수 없습니다. 여기GtkClutter 액터 신호가 실행되지 않습니다

from gi.repository import GtkClutter, Clutter, Gtk, Gdk 

GtkClutter.init([]) 

class MyCanvas(GtkClutter.Embed): 
    __gtype_name__ = 'MyCanvas' 

    def __init__(self): 
     super(MyCanvas, self).__init__() 

     self.stage = self.get_stage() 

     self.rect = MyRect() 
     self.stage.connect('key-press-event', self.key_press) # This Works! 
     self.stage.add_actor(self.rect) 
     self.rect.set_position(10, 10) 

     self.show_all() 

    def key_press(self, widget, event): 
     print widget, event 


class MyRect(Clutter.Rectangle): 
    __gtype_name__ = 'MyRect' 

    def __init__(self): 
     super(MyRect, self).__init__() 
     self.set_color(Clutter.Color.new(255, 255, 255, 0)) 
     self.set_border_color(Clutter.Color.new(255, 255, 255, 255)) 
     self.set_border_width(1) 
     self.set_size(200, 200) 

     self.set_reactive(True) 

    # None of the following callbacks work 
    # Not even if I explicitly connect signals like 
    # self.connect('button-press-event', self.on_button_press) 

    def do_button_press_event(self, event): 
     print event 

    def do_motion_event(self, event): 
     print event 


class MyWindow(Gtk.Window): 
    __gtype_name__ = 'MyWindow' 

    def __init__(self): 
     super(MyWindow, self).__init__() 
     self.canvas = AnnotateCanvas() 
     self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON1_MOTION_MASK) 
     self.set_size_request(500, 500) 

     vbox_main = Gtk.VBox() 
     scrolledwin = Gtk.ScrolledWindow() 
     scrolledwin.add_with_viewport(self.canvas) 
     vbox_main.pack_end(scrolledwin, True, True, 0) 
     self.add(vbox_main) 

    def run(self): 
     self.show_all() 
     self.loop = GObject.MainLoop() 
     self.loop.run() 


app = MyWindow() 
app.run() 

모든 신호가 잘 작동되지만 '버튼을 눌러'과 '운동'과 같은 마우스 신호가 혼란 배우 (MyRect/MyCanvas.stage) 개체에 발사되지 않은 샘플입니다. 하위 분류를 포기하고 주식 클래스로 모든 것을 처리하더라도.

나는 GtkWindow 또는 GtkEmbed 그냥 클러를 사용하는 경우 마우스 이벤트가 ClutterStage

단순화 된 버전

from gi.repository import GObject, GtkClutter, Clutter, Gtk 

GtkClutter.init([]) 

def pressed(widget, event): 
    print widget, event 

w = Gtk.Window() 
e = GtkClutter.Embed.new() 
e.set_size_request(500, 500) 
w.add(e) 

s = e.get_stage() 
s.set_color(Clutter.Color.new(0,0,0,0)) 
s.set_size(500, 500) 

r = Clutter.Rectangle() 
r.set_color(Clutter.Color.new(255,255,255,255)) 
r.set_size(200,200) 
r.set_position(0,0) 
r.set_reactive(True) 
s.add_actor(r) 

s.connect('button-press-event', pressed) 
# r.connect('button-press-event', pressed) 
w.show_all() 
GObject.MainLoop().run() 

무대와 배우 화재 마우스 신호에 전파 할 수 허용하지 않습니다 가정합니다. GtkClutter.Embed를 사용하여 GtkWindow로 무대를 삽입 할 때 그냥 작동하지 않습니다

업데이트

내가 C에 http://www.openismus.com/documents/clutter_tutorial/0.9/docs/tutorial/html/sec-stage-widget.html에서 예제를 실행하려고, 그것은 완벽하게 잘하지만 번역 작업 파이썬 (https://gist.github.com/1759658)이 전혀 작동하지 않습니다.

작동하지, 나는 무대 나는 그것이 GtkClutter.init()Gtk.init()Clutter.init() 전에 호출해야한다는 사실과 함께 할 수있는 뭔가가 있다고 생각하지만, 후자의 두 가지가 있습니다 "버튼을 눌러 이벤트"

+0

이 당신의 예를 들어 작업을 할 것 같은 패키지를 가져 오기

. – ptomato

+0

그것을 시도했다; 작동하지 않습니다. 클러 터 메인 루프와 Gtk 메인 루프 모두 시도했지만 도움이되지 않았습니다. 또한, 나는 포스트 Gtk3 이것이 우리가 메인 루프를 돌리는 방법이라고 생각한다. –

답변

6

을 발생하지 않습니다 의미 Gtk 및 Clutter 패키지를 가져올 때 호출됩니다. 당신이 당신의 자신의 메인 루프를 생성하고 실행하는 대신 GTK 메인 루프를 실행해야합니다 생각

from gi.repository import GtkClutter 
GtkClutter.init([]) 
from gi.repository import Clutter, GObject, Gtk 
+0

완벽한! 감사! –