2011-05-15 103 views
7

如果你在GTK中有一个子窗口,并且你想按程序关闭它(例如,按下保存按钮或退出键),是否有关闭窗口的首选方法?编程关闭gtk窗口

例如,

window.destroy() 
# versus 
window.emit('delete-event') 

回答

7

删除在PyGTK的一个窗口时,您应该使用window.destroy()(或与此有关的任何部件的)。当您致电window.destroy()时,窗口将自动发出delete-event事件。此外,使用PyGTK发送事件的信号时,几乎总是需要将事件对象传递给emit方法(请参阅pyGObject documentation for the emit method)。当尝试将gtk.gdk.Event(gtk.EVENT_DELETE)传递给对象的delete-event的emit方法时,它将不起作用。 E.g:

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import gtk 
>>> w = gtk.Window() 
>>> w.show() 
>>> w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)) 
False 

也许最好的办法,虽然是简单地使用del声明,会自动删除窗口/小工具,为你做任何必要的清理。这样做比调用window.destroy()更“pythonic”,它将围绕对被销毁窗口的引用留下。

13

使用销毁方法不能按预期工作,因为'delete-event'回调没有在销毁的窗口上调用,因此编辑器例如将不会有机会询问用户文件必须保存。

[3|[email protected]|~]python 
Python 2.7.3 (default, Jul 24 2012, 10:05:38) 
[GCC 4.7.0 20120507 (Red Hat 4.7.0-5)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import gtk 
>>> w = gtk.Window() 
>>> w.show() 
>>> def cb(w,e): 
... print "cb", w, e 
... return True 
... 
>>> w.connect ('delete-event', cb) 
>>> w.destroy() 

在上面的例子中调用w.destroy()将不会调用回调,而在“关闭”按钮,点击会调用它(窗口不会关闭,因为回调返回TRUE)。

因此,你必须既发射信号,然后破坏小工具,如果信号处理函数返回false,e.g:

if not w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)): 
    w.destroy()