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

Python 导入Gtk并关闭窗口后访问Gdk区域,python,window,destroy,gtk3,gdk,Python,Window,Destroy,Gtk3,Gdk,我发现自己的处境是,我需要关闭一个从Gtk.window子类化的窗口。我当时正在连接window.destroy事件,以便最初将窗口关闭到Gtk.main\u退出进行测试,但是当我将模块加载到主程序中时,当然,如果不关闭主程序,我就无法这样做。当我编写函数时,我愚蠢地调用了window.destroy()方法,我真愚蠢,这导致了一个max递归错误。因此,我决定连接一个“删除事件”,然后调用窗口。destroy(),它仍然会递归,因为(正如我所了解的)destroy事件调用delete事件。因此,

我发现自己的处境是,我需要关闭一个从
Gtk.window
子类化的窗口。我当时正在连接window.destroy事件,以便最初将窗口关闭到
Gtk.main\u退出
进行测试,但是当我将模块加载到主程序中时,当然,如果不关闭主程序,我就无法这样做。当我编写函数时,我愚蠢地调用了
window.destroy()
方法,我真愚蠢,这导致了一个max递归错误。因此,我决定连接一个“删除事件”,然后调用
窗口。destroy()
,它仍然会递归,因为(正如我所了解的)destroy事件调用delete事件。因此,我将销毁事件连接到一个函数,并尝试调用:

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中执行上面的发射信号,以便于学习

谢谢


Narnie

gtk 3中没有
gtk.gdk
,必须使用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))
但是,最好是:

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

或者更好的是,根本不要连接到模块中的事件。然后可以使用
window.destroy()
,而不会出现递归错误。连接到主程序中的销毁信号,然后只需调用
Gtk即可。main\u quit

第一部分非常有用。我就是找不到。后面的部分不起作用,因为我不想要一个
Gtk.main\u退出关闭窗口。当用户请求时(假设请求是通过X-ing弹出窗口而不是单击关闭按钮),我如何关闭窗口,而不连接到
销毁
删除事件
信号?另外,感谢您让我知道如何通过
window.event
在不“发射”自己的情况下“发射”。我在使用GUI方面还很早,所以这是真正有帮助的小金块。我很感谢那些非常容易帮助我这样的人:)好吧,如果用户单击X按钮,那么窗口就会得到
删除事件
信号,默认情况下该信号会关闭并销毁窗口,而无需您做任何事情。我想我不明白你的后续问题?