2011-05-15 59 views
7

Si tiene una ventana secundaria en GTK y desea cerrarla de forma programática (por ejemplo, presionando un botón para guardar o la tecla de escape), ¿hay alguna manera de cerrar la ventana?Cerrar programáticamente ventana gtk

por ejemplo,

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

Respuesta

7

Debe utilizar window.destroy() al borrar una ventana en PyGTK (o de hecho cualquier tipo de control). Cuando llame al window.destroy(), la ventana emitirá un evento delete-event automáticamente.

Además, al emitir una señal para un evento usando PyGTK, casi siempre es necesario pasar un objeto de evento al método de emisión (ver pyGObject documentation for the emit method). Cuando se intenta pasar un gtk.gdk.Event(gtk.EVENT_DELETE) al método de emisión de un objeto para un delete-event, no funcionará. Por ejemplo:

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 

Quizás la mejor manera, sin embargo, es simplemente usar la declaración del que borrará automáticamente la ventana/widget y hacer cualquier limpieza necesaria para usted. Hacer esto es más "pitónico" que llamar a window.destroy() que saldrá de una referencia a una ventana destruida.

13

El uso del método de destrucción no funciona como se esperaba, ya que las devoluciones de llamada de "evento de eliminación" no se invocan en la ventana destruida, por lo que un editor, por ejemplo, no podrá preguntar al usuario si el archivo tiene que ser salvado

[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() 

En el ejemplo anterior w.destroy invocando() no invocará la devolución de llamada, mientras hace clic en el botón "Cerrar" se invocará (y la ventana no se cerrará porque devolución de llamada devuelve True).

Por lo tanto, usted tiene que emiten tanto la señal y luego destruir el widget, si los gestores de señales devueltas Falso, por ejemplo:

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