2014-10-20 9 views
0

Windows에서 Gtk3 및 클러 터를 사용하여 개발할 때 우수한 PyGI AIO (3.14.0) 바이너리를 사용하고 있습니다. 지금까지 그것은 위대한 일을 해왔습니다. 그러나 포인터 이벤트가 GtkClutter.Embed 위젯 내부의 Clutter.Stage에 도달하지 않는 문제가있는 것으로 보입니다. 다음은 코드입니다.GtkClutter - Stutter가 포인터 이벤트를받지 못함

import sys 

from gi.repository import GtkClutter 
GtkClutter.init(sys.argv) 
from gi.repository import Clutter, Gdk, Gtk, GObject 

def main(): 
    win = Gtk.Window(Gtk.WindowType.TOPLEVEL) 

    # Works 
    #win.connect('button-press-event', lambda *args: sys.stdout.write("BP\n")) 
    #win.connect('button-release-event', lambda *args: sys.stdout.write("BR\n")) 
    #win.connect('motion-notify-event', lambda *args: sys.stdout.write("ME\n")) 

    embed = GtkClutter.Embed() 
    embed.set_size_request(800, 600) 

    # Works 
    #embed.connect('button-press-event', lambda *args: sys.stdout.write("BP\n")) 
    #embed.connect('button-release-event', lambda *args: sys.stdout.write("BR\n")) 
    #embed.connect('motion-notify-event', lambda *args: sys.stdout.write("ME\n")) 

    stage = embed.get_stage() 
    stage.set_reactive(True) 
    stage.set_size(800, 600) 
    stage.set_color(Clutter.Color.new(0, 128, 0, 255)) 

    # Fails 
    stage.connect('button-press-event', lambda *args: sys.stdout.write("BP\n")) 
    stage.connect('button-release-event', lambda *args: sys.stdout.write("BR\n")) 
    stage.connect('motion-event', lambda *args: sys.stdout.write("ME\n")) 

    # Works (surprisingly...) 
    stage.connect('key-press-event', lambda *args: sys.stdout.write("KP\n")) 
    stage.connect('key-release-event', lambda *args: sys.stdout.write("KR\n")) 

    stage.show_all() 

    win.add(embed) 

    win.connect("delete-event", Gtk.main_quit) 
    win.show_all() 

    Gtk.main() 

    return 0 

if __name__ == '__main__': 
    sys.exit(main()) 

위의 코드가 맞습니까? 이것이 Windows 관련 문제인지 궁금합니다. 아무도 다른 OS에서 문제를 재현 할 수 있습니까?

+1

콘솔에서 경고를 받고 있습니까? Clutter가 디버그 지원이 가능하도록 컴파일 된 경우,'CLUTTER_DEBUG = all' 환경 변수를 export하고 어딘가에 붙여 넣을 수 있습니까? – ebassi

+0

불행히도 이러한 바이너리 (PyGI AIO)는 디버그 지원이 활성화되어 컴파일되지 않았습니다. CLUTTER_SHOW_FPS를 사용하여 프레임 속도를 인쇄했지만 CLUTTER_DEBUG를 설정해도 추가 출력이 생성되지 않았습니다. – kloffy

답변

2

오래 전지도 앱 개발자가 이런 종류의 보고서를 받았습니다. 나는 그가

from gi.repository import Clutter 
Clutter.set_windowing_backend(Clutter.WINDOWING_GDK) 

참고 일명 GDK 백엔드로 전환하는 것이 좋습니다 : 위의 다른 혼란 물건 전에 수행해야

지금이지만 여전히 C의 예는 그 해결없이 잘 작동되는 이벤트를 캐치한다, 그래서 '

바인딩 수준에서 작동하지 않는 이유는 알 수 없습니다. 나는 또한 당신의 코드가 이미 gtk-clutter-test.c와 비슷하다고 생각한다.

+0

BTW, 이것은 해결책이 아닌 회피책이며, 가정 된 백엔드는 win32입니다. gdk로 전환하면 글꼴 렌더링 문제가 발생할 수 있습니다. – tumagonx

+0

예, 참으로 오지 않는 흥미로운 이벤트 문제를 해결합니다. 그러나 때로는 무대가 나타나지 않고 다음과 같은 경고가 나타납니다. 경고 : 'gint'유형의 '0'값이 잘못되었거나 'gint'유형의 'window-scaling-factor'속성에 대한 범위를 벗어났습니다. . – kloffy

+0

수정, gtk-clutter-events.c 예제가 실제로 예상대로 작동하지 않았습니다. 임베디드 위젯이 이벤트를 수신하는 동안 스테이지 자체는 그렇지 않은 것처럼 보입니다. 이 디버그를 시도하고 업스트림에보고합니다. – tumagonx