以编程方式关闭gtk窗口

use*_*450 8 gtk pygtk

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

例如,

window.destroy()
# versus
window.emit('delete-event')
Run Code Online (Sandbox Code Playgroud)

zap*_*zap 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()
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,调用w.destroy()不会调用回调,而单击"关闭"按钮将调用它(并且窗口不会关闭,因为回调返回True).

因此,如果信号处理程序返回False,则必须发出信号然后销毁小部件,例如:

if not w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)):
  w.destroy()
Run Code Online (Sandbox Code Playgroud)


Wir*_*uce 9

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

此外,当使用PyGTK为事件发出信号时,几乎总是需要将事件对象传递给emit方法(请参阅用于emit方法pyGObject文档).当尝试将a传递gtk.gdk.Event(gtk.EVENT_DELETE)给对象的emit方法时,delete-event它将无法工作.例如:

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
Run Code Online (Sandbox Code Playgroud)

也许最好的方法是简单地使用del自动删除窗口/窗口小部件并为您进行任何必要清理的语句.这样做比调用window.destroy()更加"pythonic",它会留下对被破坏窗口的引用.