Skip to main content
 首页 » 编程设计

python之导入Gtk并关闭窗口后访问Gdk区域

2025年05月04日10qq78292959

我发现自己处于需要关闭从 Gtk.Window 子类化的窗口的情况。我正在连接 window.destroy 事件以关闭窗口最初到 Gtk.main_quit 进行测试,但是当我将模块加载到我的主程序中时,我不能那样做,当然,无需关闭主程序。当我写一个函数时,我愚蠢地调用了 window.destroy() 方法,这对我来说很愚蠢,导致了最大递归错误。因此,我决定连接一个“删除事件”,然后调用 window.destroy(),它仍然递归,因为(据我了解)销毁事件调用 delete-event。因此,我将 destroy 事件连接到一个函数并尝试调用:

window.emit('delete-event') 

这有效,但导致需要另一个参数的错误。通过研究,我从 gtk2 了解到它需要像这样:

window.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)) 

我在 Gtk 下找不到 Gdk,就像在 gtk 下找不到 gdk 一样。我不喜欢这个。我导入了 Gdk 并找到了 Gdk.Event,但没有等同于 gtk.gdk.DELETE 变量。我做了一个:

l = dir(Gdk) 
for i in l: 
    if 'DELETE' in i: 
        print(i) 

并提出在 Gdk 中没有定义 DELETE 变量。

我们如何从 Gtk 访问 Gdk?如果不是,我们如何翻译这些 gtk.gdk... Gdk 下不存在的东西?

最终,我做到了:

del window 

做我需要做的,但我仍然想知道如何在 Gtk3 中发出上面的信号以供学习。

谢谢,

纳尼

请您参考如下方法:

GTK 3 中没有 gtk.gdk,所有这些功能或等效功能必须可以使用 from gi.repository import Gdk。之前的gtk.gdk层次结构其实是为了方便,但是没有任何意义,因为GDK是一个完全独立的包,不是GTK的一部分。新组织更有意义,因为层次结构和变量名称与 C、Javascript 等 API 中的完全相同。

在这种情况下,gtk.gdk.DELETE 可作为 Gdk.EventType.DELETE 使用,因此您应该可以这样做

window.emit('delete-event', Gdk.Event(Gdk.EventType.DELETE)) 

然而,you are not supposed to emit event signals yourself ,所以最好这样做:

window.event(Gdk.Event(Gdk.EventType.DELETE)) 

或者更好的是,根本不要连接到模块中的事件。然后你可以使用 window.destroy() 而不会出现递归错误。在您的主程序中连接到 destroy 信号,然后您可以简单地调用 Gtk.main_quit。