如果您在GTK中有一个子窗口并且想要以编程方式关闭它(例如,按下保存按钮或转义键),是否有关闭窗口的首选方法?
如,
window.destroy()
# versus
window.emit('delete-event')
答案 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);
请求关闭窗口,类似于 单击窗口管理器的关闭按钮。
此功能可以与自定义标题栏中的关闭按钮一起使用。