不使用GTK处理GDK事件

3 投票
2 回答
1300 浏览
提问于 2025-04-16 20:09

我正在用Python编程,使用GDK而不使用GTK,简单来说就是在做一个X11的抽象。这篇帖子是我最后的机会。

我的问题是,我不知道怎么捕捉GDK窗口的信号或事件,也不知道它们的名字是什么。

当我这样做的时候:

window = gdk.Window(
            gdk.get_default_root_window(),
            width=400,
            height=200,
            window_type=gdk.WINDOW_CHILD,
            wclass=gdk.INPUT_OUTPUT,
            event_mask=gdk.KEY_PRESS_MASK | gdk.MOTION_NOTIFY | gdk.EXPOSURE_MASK)

window.connect("key_press_event", on_key)

我得到的是:

unknown signal name: key_press_event

关于GTK和PYGTK的资料提到了类、函数和常量,但没有讲它们之间的关系,所以对我没有帮助。难道是和glib主循环有关吗?

我需要一些例子。有好的GDK教程或者源代码吗?有没有glib.MainLoop的例子可以用来捕捉GDK信号?

谢谢。

2 个回答

1

你正在尝试连接一个叫做 key-press-event 的信号,这个信号属于 gtk.Widget。但是,gdk.Window 并不是从 gtk.Widget 继承来的,所以它没有这个信号。

在GTK的文档中,顶部有一些小部分叫做“对象层次结构”,它们告诉你这些类之间是如何关联的。其实并没有真正的GDK教程,因为你几乎总是和GTK一起使用它。我觉得单独使用GDK也没什么太大用处。也许你可以详细说明一下你想要实现的目标?

1

你可以使用 gdk_event_handler_set 来设置事件处理程序(这个处理程序也是 gtk 使用的函数)。我不知道你用的是哪个 Python 绑定,但我觉得你可以很容易找到对应的 Python 函数。(在 gi 中,它就是 Gdk.Event.handler_set)

你可以在 这里 查看一个例子(那里还有一个非阻塞的例子)。虽然这些例子是用 C 语言写的。

撰写回答