以编程方式关闭gtk窗口

以编程方式关闭gtk窗口,gtk,pygtk,Gtk,Pygtk,如果您在GTK中有一个子窗口,并且希望以编程方式关闭它(例如,按下保存按钮或退出键),是否有首选方法关闭该窗口 例如: 在PyGTK(或任何类型的小部件)中删除窗口时,应该使用window.destroy()。调用window.destroy()时,窗口将自动发出delete事件 此外,当使用PyGTK为事件发出信号时,几乎总是需要将事件对象传递给emit方法(请参阅)。当试图将gtk.gdk.Event(gtk.Event_DELETE)传递给对象的DELETE事件的emit方法时,它将不起作

如果您在GTK中有一个子窗口,并且希望以编程方式关闭它(例如,按下保存按钮或退出键),是否有首选方法关闭该窗口

例如:


在PyGTK(或任何类型的小部件)中删除窗口时,应该使用
window.destroy()
。调用
window.destroy()
时,窗口将自动发出
delete事件

此外,当使用PyGTK为事件发出信号时,几乎总是需要将事件对象传递给emit方法(请参阅)。当试图将
gtk.gdk.Event(gtk.Event_DELETE)
传递给对象的
DELETE事件的emit方法时,它将不起作用。例如:

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”,后者会留下一个对已销毁窗口的引用。

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

[3|zap@zap|~]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,则必须发出信号,然后销毁小部件,例如:

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

适用于GTK 3.10及以上版本

void
gtk_window_close (GtkWindow *window);
请求关闭窗口,类似于 单击“窗口管理器关闭”按钮

此功能可与自定义标题栏中的关闭按钮一起使用

void
gtk_window_close (GtkWindow *window);