Программно закрыть окно GTK - PullRequest
8 голосов
/ 15 мая 2011

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

например.,

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

Ответы [ 2 ]

15 голосов
/ 25 октября 2012

Использование метода 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()
9 голосов
/ 15 мая 2011

Вы должны использовать 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, который автоматически удалит окно / виджет и сделает любую необходимую для вас очистку.Это более «питонно», чем вызов window.destroy (), который оставляет ссылку на разрушенное окно.

...