0

我正在使用优秀的PyGI AIO (3.14.0)二进制文件在 Windows 上使用 Gtk3 和 Clutter 进行开发。到目前为止,它一直运作良好。但是,指针事件似乎有问题没有到达 GtkClutter.Embed 小部件内的 Clutter.Stage。这是代码:

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 特定的问题。任何人都可以在另一个操作系统上重现该问题吗?

4

1 回答 1

2

我很久以前就收到过地图应用程序开发人员的这种报告。我建议他切换到 gdk 后端 aka

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

注意:上面应该在其他杂乱的东西之前完成

它现在应该捕获事件,但是如果没有这种解决方法,所有 C 示例仍然可以正常工作,所以我不知道为什么它在绑定级别不起作用。我认为您的代码也已经符合 gtk-clutter-test.c 的要求。

于 2015-02-16T22:40:35.863 回答