Программно закрыть окно gtk

Если у вас есть подокно в GTK, и вы хотите закрыть его программно (например, нажав кнопку Сохранить или клавишу escape), есть ли предпочтительный способ закрыть окно?

Е. Г.,

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

2 ответов


вы должны использовать window.destroy() при удалении окна в PyGTK (или, если на то пошло, любого виджета). Когда вы звоните window.destroy() Окно выдаст delete-event событие автоматически.

кроме того, при излучении сигнала для события с помощью PyGTK почти всегда требуется также передать объект события методу emit (см. документация pyGObject для метода emit). Когда делается попытка передать 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

возможно, лучший способ-это просто использовать del заявление, которое автоматически удалит окно / виджет и сделает любую необходимую очистку для вас. Это более подходящие для Python, чем вызов окна.destroy (), который оставит вокруг ссылки на уничтоженное окно.


использование метода 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, e.g:

if not w.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE)):
  w.destroy()