2013-01-02 33 views
2

我发现自己处于需要关闭从Gtk.Window分类的窗口的情况。我连接的window.destroy事件最初关闭窗口到Gtk.main_quit进行测试,但是当我将模块加载到我的主程序中时,我无法这样做,当然,没有关闭主程序。当我写了一个函数,我愚蠢地调用window.destroy()方法,愚蠢的我导致了最大递归错误。所以,我决定连接一个'删除事件',然后调用仍然递归的window.destroy(),因为(据我所知)一个销毁事件调用delete-event。所以,我连接破坏事件的功能,并试图拨打:导入Gtk并关闭窗口后访问Gdk区域

window.emit('delete-event') 

其工作,但导致想要另一个参数错误。研究,我学会了它需要的是像这样从GTK2:

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

我找不到GdkGtk下像我gtk下找到gdk。我不喜欢这个。我导入Gdk并找到Gdk.Event,但没有与gtk.gdk.DELETE variable等效。我做了一个:

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

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

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

最终,我只是做:

del window 

做什么,我需要做的,但我还是想知道怎么做发射信号上述Gtk3学习的目的。

感谢,

Narnie

回答

1

有一个在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()而不会发生递归错误。连接到主程序中的销毁信号,然后您可以简单地致电Gtk.main_quit

+0

第一部分确实有帮助。我无法找到它。后一部分将不起作用,因为我不想让'Gtk.main_quit'关闭窗口。如果没有连接到'destroy'或'delete-event'信号,用户提出请求时(假设请求来自X窗口并且没有单击关闭按钮),我该如何关闭窗口? – narnie

+0

此外,感谢让我知道如何“发射”,而不是“发射”自己,但通过“Window.event”。我仍然很早就使用GUI,所以这是真正有用的小金块。我非常感谢那些非常轻松地帮助像我这样的人:) – narnie

+0

好吧,如果用户点击X按钮,那么窗口会获得'delete-event'信号,默认情况下它应该关闭并销毁窗口,而不需要你必须做任何事情。我想我不明白你的后续问题? – ptomato