wxPython - Gestion des événements
Contrairement à une application en mode console, qui est exécutée de manière séquentielle, une application basée sur l'interface graphique est pilotée par les événements. Les fonctions ou méthodes sont exécutées en réponse aux actions de l'utilisateur comme cliquer sur un bouton, sélectionner un élément de la collection ou cliquer avec la souris, etc., appelés événements.
Les données relatives à un événement qui a lieu pendant l'exécution de l'application sont stockées en tant qu'objet d'une sous-classe dérivée de wx.Event. Un contrôle d'affichage (tel que Button) est la source d'un événement d'un type particulier et produit un objet de la classe Event qui lui est associé. Par exemple, un clic sur un bouton émet un wx.CommandEvent. Ces données d'événement sont distribuées à la méthode de gestionnaire d'événements dans le programme. wxPython a de nombreux classeurs d'événements prédéfinis. UnEvent binder encapsule la relation entre un widget spécifique (contrôle), son type d'événement associé et la méthode du gestionnaire d'événements.
Par exemple, pour appeler OnClick() method du programme sur l'événement de clic d'un bouton, la déclaration suivante est requise -
self.b1.Bind(EVT_BUTTON, OnClick)
Bind() methodest hérité par tous les objets d'affichage de la classe wx.EvtHandler. EVT_.BUTTON ici est le classeur, qui associe l'événement de clic de bouton à la méthode OnClick ().
Exemple
Dans l'exemple suivant, le MoveEvent, provoqué en faisant glisser la fenêtre de niveau supérieur - un objet wx.Frame dans ce cas - est connecté à OnMove() methoden utilisant le classeur wx.EVT_MOVE. Le code affiche une fenêtre. S'il est déplacé à l'aide de la souris, ses coordonnées instantanées sont affichées sur la console.
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()
Le code ci-dessus produit la sortie suivante -
position actuelle de la fenêtre x = 562 y = 309
position actuelle de la fenêtre x = 562 y = 309
position actuelle de la fenêtre x = 326 y = 304
position actuelle de la fenêtre x = 384 y = 240
position actuelle de la fenêtre x = 173 y = 408
position actuelle de la fenêtre x = 226 y = 30
position actuelle de la fenêtre x = 481 y = 80
Certaines des sous-classes héritées de wx.Event sont répertoriées dans le tableau suivant -
SN | Événements et description |
---|---|
1 | wxKeyEvent Se produit lorsqu'une touche est enfoncée ou relâchée |
2 | wxPaintEvent Est généré chaque fois que le contenu de la fenêtre doit être redessiné |
3 | wxMouseEvent Contient des données sur tout événement dû à l'activité de la souris, comme le bouton de la souris enfoncé ou glissé |
4 | wxScrollEvent Associé à des contrôles déroulants tels que wxScrollbar et wxSlider |
5 | wxCommandEvent Contient des données d'événement provenant de nombreux widgets tels que des boutons, des boîtes de dialogue, le presse-papiers, etc. |
6 | wxMenuEvent Différents événements liés au menu, à l'exclusion du clic sur le bouton de commande de menu |
sept | wxColourPickerEvent Événements générés par wxColourPickerCtrl |
8 | wxDirFilePickerEvent Événements générés par FileDialog et DirDialog |
Les événements dans wxPython sont de deux types. Événements de base et événements de commande. Un événement de base reste local dans la fenêtre dont il provient. La plupart des wxWidgets génèrent des événements de commande. UNEcommand event peut être propagé à la fenêtre ou aux fenêtres, qui sont au-dessus de la fenêtre source dans la hiérarchie des classes.
Exemple
Voici un exemple simple de propagation d'événements. Le code complet est -
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()
Dans le code ci-dessus, il existe deux classes. MyPanel, une sous-classe wx.Panel et Exemple, une sous-classe wx.Frame qui est la fenêtre de niveau supérieur du programme. Un bouton est placé dans le panneau.
Cet objet Button est lié à un gestionnaire d'événements btnclk () qui le propage à la classe parente (MyPanel dans ce cas). Un clic sur le bouton génère unCommandEvent qui peut être propagé à son parent par la méthode Skip ().
L'objet de classe MyPanel lie également l'événement reçu à un autre gestionnaire OnButtonClicked (). Cette fonction transmet à son tour à son parent, la classe Example. Le code ci-dessus produit la sortie suivante -
Button received click event. Propagated to Panel class.
Panel received click event. Propagated to Frame class.
Click event received by frame class.