Gestionnaire d'événement pour les boutons

DéfinitionBouton

Un bouton est un contrôle[1] contenant un texte. Il doit être placé soit dans une fenêtre. Un bouton peut être inactif (disabled), pressé (pressed), normal, avoir le focus (les entrées clavier sont redirigées vers le bouton),, courant (la souris est au dessus du bouton).

Quand le bouton est pressé un événement wx.EVT_BUTTON est généré.

Exempleutilisation de boutons

Dans ce programme, deux boutons sont ajoutés à la fenêtre. Un gestionnaire d'événement (pour wx.EVT_BUTTON) est associé à chaque bouton. Lorsque l'on clique sur ces boutons, le gestionnaire d'événement affiche le numéro du bouton dans la console et le texte du bouton est changé.

Cet exemple crée une classe MaFenetre. Le constructeur de MaFenetre construit deux objets boutons en appelant le constructeur wx.Button. L'identifiant du premier bouton est 1000, son texte est X, sa position dans la fenêtre est (20,25) et sa taille est de 50 (largeur) par 20(hauteur).

1
class MaFenetre(wx.Frame):    
2
    def __init__(self):
3
        super().__init__(parent=None, title='Ma fenêtre avec bouton')
4
        
5
        bouton1 = wx.Button(self, id=1000, label='X', pos=(20, 25),size=(50,20))
6
        bouton2 = wx.Button(self, id=1010, label='I', pos=(50, 55),size=(50,50))
7

L'appel de la méthode Bind permet d'exécuter lorsqu'un événement wx.EVT_BUTTON se produit la méthode OnBouton si l'un des boutons est pressé.

1
        self.Bind(wx.EVT_BUTTON, self.OnBouton, bouton1)
2
        self.Bind(wx.EVT_BUTTON, self.OnBouton, bouton2)
3

Le gestionnaire d'événement des boutons, la méthode OnBouton de la classe MaFenetre, affiche dans la console l'identifiant du bouton en utilisant la méthode GetId() de l'objet event passé en paramètre.

Le bouton pressé est obtenu en appelant la méthode GetEventObject() de l'objet event passé en paramètre. Le texte de ce bouton est obtenu en appelant la méthode GetLabel() de la classe wx.Button.

Une fois le texte obtenu, il est modifié en fonction de son contenu.

1
     def OnBouton(self, event):
2
        print("Bouton ",event.GetId())
3
        button = event.GetEventObject()
4
        s = button.GetLabel()
5
        if s == "X":
6
            button.SetLabel("O")
7
        elif s == "O":
8
            button.SetLabel("X")
9
        if s == "I":
10
            button.SetLabel("-")
11
        elif s == "-":
12
            button.SetLabel("I")
13

Le programme complet est ici :

1
import wx
2
3
class MaFenetre(wx.Frame):    
4
    def __init__(self):
5
        super().__init__(parent=None, title='Ma fenêtre avec bouton')
6
        
7
        bouton1 = wx.Button(self, id=1000, label='X', pos=(20, 25),size=(50,20))
8
        bouton2 = wx.Button(self, id=1010, label='I', pos=(50, 55),size=(50,50))
9
        self.Bind(wx.EVT_BUTTON, self.OnBouton, bouton1)
10
        self.Bind(wx.EVT_BUTTON, self.OnBouton, bouton2)
11
        self.Show()
12
13
     def OnBouton(self, event):
14
        print("Bouton ",event.GetId())
15
        button = event.GetEventObject()
16
        s = button.GetLabel()
17
        if s == "X":
18
            button.SetLabel("O")
19
        elif s == "O":
20
            button.SetLabel("X")
21
        if s == "I":
22
            button.SetLabel("-")
23
        elif s == "-":
24
            button.SetLabel("I")
25
       
26
if __name__ == '__main__':
27
    app = wx.App()
28
    frame = MaFenetre()
29
    app.MainLoop()
30

ExempleAssocier un gestionnaire d'événement par bouton

Pour chaque bouton, on associe un gestionnaire d'événement (OnBouton1 ou OnBouton2). Cela permet de simplifier la gestion le traitement de la gestion du label.

1
import wx
2
3
class MaFenetre(wx.Frame):    
4
    def __init__(self):
5
        super().__init__(parent=None, title='Hello World')
6
        
7
        bouton1 = wx.Button(self, id=1000, label='X', pos=(20, 25),size=(50,20))
8
        bouton2 = wx.Button(self, id=1010, label='I', pos=(50, 55),size=(50,50))
9
        self.Bind(wx.EVT_BUTTON, self.OnBouton1, bouton1)
10
        self.Bind(wx.EVT_BUTTON, self.OnBouton2, bouton2)
11
        self.Show()
12
13
    def PrintBouton(self, event):
14
        print("Bouton ",event.GetId())
15
        button = event.GetEventObject()
16
        s = button.GetLabel()
17
        return s, button
18
        
19
    def OnBouton1(self, event):
20
        s, button = self.PrintBouton(event)
21
        if s == "X":
22
            button.SetLabel("O")
23
        else:
24
            button.SetLabel("X")
25
26
    def OnBouton2(self, event):
27
        s, button = self.PrintBouton(event)
28
        if s == "I":
29
            button.SetLabel("-")
30
        else:
31
            button.SetLabel("I")
32
       
33
if __name__ == '__main__':
34
    app = wx.App()
35
    frame = MaFenetre()
36
    app.MainLoop()
37