2.3. Eventos

Además del mecanismo de señales descrito anteriormente, hay un conjunto de eventos que reflejan el mecanismo de eventos de X. Las retrollamadas también se pueden conectar a estos eventos. Estos eventos son:

  event
  button_press_event
  button_release_event
  scroll_event
  motion_notify_event
  delete_event
  destroy_event
  expose_event
  key_press_event
  key_release_event
  enter_notify_event
  leave_notify_event
  configure_event
  focus_in_event
  focus_out_event
  map_event
  unmap_event
  property_notify_event
  selection_clear_event
  selection_request_event
  selection_notify_event
  proximity_in_event
  proximity_out_event
  visibility_notify_event
  client_event
  no_expose_event
  window_state_event

Para conectar una función de retrollamada a uno de estos eventos se usa el método connect(), como se ha dicho anteriormente, usando uno de los nombres de eventos anteriores en el parámetro name. La función (o método) de retrollamada para eventos es ligeramente diferente de la usada para señales:

  def callback_func(widget, event, callback_data):

  def callback_meth(self, widget, event, callback_data):

gdk.Event es un tipo de objetos Python cuyos atributos de tipo indicarán cuál de los eventos anteriores ha ocurrido. Los otros atributos del evento dependerán del tipo de evento. Los valores posibles para los tipos son:

  NOTHING
  DELETE
  DESTROY
  EXPOSE
  MOTION_NOTIFY
  BUTTON_PRESS
  _2BUTTON_PRESS
  _3BUTTON_PRESS
  BUTTON_RELEASE
  KEY_PRESS
  KEY_RELEASE
  ENTER_NOTIFY
  LEAVE_NOTIFY
  FOCUS_CHANGE
  CONFIGURE
  MAP
  UNMAP
  PROPERTY_NOTIFY
  SELECTION_CLEAR
  SELECTION_REQUEST
  SELECTION_NOTIFY
  PROXIMITY_IN
  PROXIMITY_OUT
  DRAG_ENTER
  DRAG_LEAVE
  DRAG_MOTION
  DRAG_STATUS
  DROP_START
  DROP_FINISHED
  CLIENT_EVENT
  VISIBILITY_NOTIFY
  NO_EXPOSE
  SCROLL
  WINDOW_STATE
  SETTING

Para acceder a estos valores se añade el prefijo gtk.gdk. al tipo de evento. Por ejemplo, gtk.gdk.DRAG_ENTER.

Por tanto, para conectar una función de retrollamada a uno de estos eventos se usaría algo como:

  button.connect("button_press_event", button_press_callback)

Esto asume que button es un control gtk.Button. Entonces, cuando el ratón esté sobre el botón y se pulse un botón del ratón, se llamará a la función button_press_callback. Esta función se puede definir así:

  def button_press_callback(widget, event, data):

El valor que devuelve esta función indica si el evento debe ser propagado por el sistema de manejo de eventos GTK+. Devolviendo gtk.TRUE indicamos que el evento ha sido procesado, y que no debe ser propagado. Devolviendo gtk.FALSE se continua el procesamiento normal del evento. Es aconsejable consultar la sección Procesamiento Avanzado de Eventos y Señales para obtener más detalles sobre el sistema de propagación.

Las APIs de selección y arrastrar y soltar de GDK también emiten unos cuantos eventos que se reflejan en GTK+ por medio de señales. Consulta Señales en el Control de Orígen y Señales en el Control de Destino para obtener más detalles sobre la sintaxis de las funciones de retrollamada para estas señales:

  selection_received
  selection_get
  drag_begin_event
  drag_end_event
  drag_data_delete
  drag_motion
  drag_drop
  drag_data_get
  drag_data_received