如果您在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)
您应该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",它会留下对被破坏窗口的引用.