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.