以编程方式关闭gtk窗口

时间:2011-05-15 00:07:35

标签: gtk pygtk

如果您在GTK中有一个子窗口并且想要以编程方式关闭它(例如,按下保存按钮或转义键),是否有关闭窗口的首选方法?

如,

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

3 个答案:

答案 0 :(得分:15)

使用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()

答案 1 :(得分:9)

在删除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”,它会留下对被破坏窗口的引用。

答案 2 :(得分:0)

对于GTK 3.10及更高版本。

void
gtk_window_close (GtkWindow *window);
  

请求关闭窗口,类似于   单击窗口管理器的关闭按钮。

     

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

gtk_window_close ()