如果你在GTK中有一个子窗口,并且你想按程序关闭它(例如,按下保存按钮或退出键),是否有关闭窗口的首选方法?编程关闭gtk窗口
例如,
window.destroy()
# versus
window.emit('delete-event')
如果你在GTK中有一个子窗口,并且你想按程序关闭它(例如,按下保存按钮或退出键),是否有关闭窗口的首选方法?编程关闭gtk窗口
例如,
window.destroy()
# versus
window.emit('delete-event')
删除在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”,它将围绕对被销毁窗口的引用留下。
使用销毁方法不能按预期工作,因为'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()