wxPython - Manejo de eventos

A diferencia de una aplicación en modo de consola, que se ejecuta de manera secuencial, una aplicación basada en GUI está impulsada por eventos. Las funciones o métodos se ejecutan en respuesta a las acciones del usuario, como hacer clic en un botón, seleccionar un elemento de la colección o hacer clic con el mouse, etc., llamados eventos.

Los datos pertenecientes a un evento que tiene lugar durante el tiempo de ejecución de la aplicación se almacenan como objeto de una subclase derivada de wx.Event. Un control de visualización (como Button) es la fuente de un evento de un tipo particular y produce un objeto de la clase Event asociado a él. Por ejemplo, al hacer clic en un botón se emite un wx.CommandEvent. Estos datos de eventos se envían al método controlador de eventos en el programa. wxPython tiene muchas carpetas de eventos predefinidas. UnEvent binder encapsula la relación entre un widget específico (control), su tipo de evento asociado y el método del controlador de eventos.

Por ejemplo, para llamar OnClick() method del programa en el evento de clic de un botón, se requiere la siguiente declaración:

self.b1.Bind(EVT_BUTTON, OnClick)

Bind() methodes heredado por todos los objetos de visualización de la clase wx.EvtHandler. EVT_.BUTTON aquí es la carpeta, que asocia el evento de clic de botón al método OnClick ().

Ejemplo

En el siguiente ejemplo, MoveEvent, causado al arrastrar la ventana de nivel superior, un objeto wx.Frame en este caso, está conectado a OnMove() methodutilizando el cuaderno wx.EVT_MOVE. El código muestra una ventana. Si se mueve con el mouse, sus coordenadas instantáneas se muestran en la consola.

import wx
  
class Example(wx.Frame): 
            
   def __init__(self, *args, **kw): 
      super(Example, self).__init__(*args, **kw)  
      self.InitUI() 
           
   def InitUI(self): 
      self.Bind(wx.EVT_MOVE, self.OnMove) 
      self.SetSize((250, 180)) 
      self.SetTitle('Move event') 
      self.Centre() 
      self.Show(True)
		   
   def OnMove(self, e): 
      x, y = e.GetPosition() 
      print "current window position x = ",x," y= ",y 
         
ex = wx.App() 
Example(None) 
ex.MainLoop()

El código anterior produce la siguiente salida:

posición actual de la ventana x = 562 y = 309

posición actual de la ventana x = 562 y = 309

posición actual de la ventana x = 326 y = 304

posición actual de la ventana x = 384 y = 240

posición actual de la ventana x = 173 y = 408

posición actual de la ventana x = 226 y = 30

posición actual de la ventana x = 481 y = 80

Algunas de las subclases heredadas de wx.Event se enumeran en la siguiente tabla:

SN Eventos y descripción
1

wxKeyEvent

Ocurre cuando se presiona o suelta una tecla

2

wxPaintEvent

Se genera siempre que sea necesario volver a dibujar el contenido de la ventana.

3

wxMouseEvent

Contiene datos sobre cualquier evento debido a la actividad del mouse, como el botón del mouse presionado o arrastrado

4

wxScrollEvent

Asociado con controles desplazables como wxScrollbar y wxSlider

5

wxCommandEvent

Contiene datos de eventos que se originan en muchos widgets, como botones, cuadros de diálogo, portapapeles, etc.

6

wxMenuEvent

Diferentes eventos relacionados con el menú, excepto el clic del botón de comando del menú

7

wxColourPickerEvent

Eventos generados por wxColourPickerCtrl

8

wxDirFilePickerEvent

Eventos generados por FileDialog y DirDialog

Los eventos en wxPython son de dos tipos. Eventos básicos y eventos de comando. Un evento básico permanece local a la ventana en la que se origina. La mayoría de los wxWidgets generan eventos de comando. UNcommand event se puede propagar a la ventana o ventanas, que están por encima de la ventana de origen en la jerarquía de clases.

Ejemplo

A continuación se muestra un ejemplo sencillo de propagación de eventos. El código completo es:

import wx
  
class MyPanel(wx.Panel): 
     
   def __init__(self, parent): 
      super(MyPanel, self).__init__(parent)
		
      b = wx.Button(self, label = 'Btn', pos = (100,100)) 
      b.Bind(wx.EVT_BUTTON, self.btnclk) 
      self.Bind(wx.EVT_BUTTON, self.OnButtonClicked) 
		
   def OnButtonClicked(self, e): 
         
      print 'Panel received click event. propagated to Frame class' 
      e.Skip()  
		
   def btnclk(self,e): 
      print "Button received click event. propagated to Panel class" 
      e.Skip()
		
class Example(wx.Frame):

   def __init__(self,parent): 
      super(Example, self).__init__(parent)  
         
      self.InitUI() 

   def InitUI(self):
	
      mpnl = MyPanel(self) 
      self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
		
      self.SetTitle('Event propagation demo') 
      self.Centre() 
      self.Show(True)
		
   def OnButtonClicked(self, e): 
         
      print 'click event received by frame class' 
      e.Skip()
		
ex = wx.App() 
Example(None) 
ex.MainLoop()

En el código anterior, hay dos clases. MyPanel, una subclase wx.Panel y Ejemplo, una subclase wx.Frame que es la ventana de nivel superior para el programa. Se coloca un botón en el panel.

Este objeto Button está vinculado a un controlador de eventos btnclk () que lo propaga a la clase principal (MyPanel en este caso). El clic del botón genera unCommandEvent que se puede propagar a su padre mediante el método Skip ().

El objeto de clase MyPanel también vincula el evento recibido a otro controlador OnButtonClicked (). Esta función a su vez transmite a su padre, la clase Example. El código anterior produce la siguiente salida:

Button received click event. Propagated to Panel class. 
Panel received click event. Propagated to Frame class. 
Click event received by frame class.