Bouton avec image (BitmapButton)

Définitionwx.BitmapButton

un BitmapButton est un bouton dont le fond est une image. L'image du bouton peut être changée en fonction de l'état du bouton

Exemple

Cet exemple complète l'exemple précédent en ajoutant des wx.BitmapButton au lieu de wx.Button. Deux images sont chargées, et à chaque clic dans un bouton, l'image du bouton sera changée.

Le constructeur de la classe MaFenetre. récupère le chemin du script. Ce chemin est utilisé pour charger les deux images qui doivent être placées dans le même dossier. Les deux images sont :

[1] et [2]

L'appel à os.path.realpath suivi de os.path.dirname permet d'obtenir le chemin du script python (votre programme !)

1
import wx
2
import os
3
4
class MaFenetre(wx.Frame):    
5
    def __init__(self):
6
        chemin_script = os.path.dirname(os.path.realpath(__file__))
7

Les deux images sont chargées dans un objet wx.Bitmap (type d'image pour l'affichage) en donnant le chemin des fichiers images.

On prépare la fenêtre pour recevoir 16 boutons positionnés dans un wx.GridSizer comme dans l'exemple précédent.

1
        super().__init__(parent=None, title='Ma fenêtre avec BitmapButton')
2
        self.bmp1 = wx.Bitmap(chemin_script+"\\1.png", wx.BITMAP_TYPE_PNG) 
3
        self.bmp2 = wx.Bitmap(chemin_script+"\\2.png", wx.BITMAP_TYPE_PNG) 
4
        nb_boutons = 16
5
        self.ma_grille = wx.GridSizer(rows=4, cols=4, vgap=10, hgap=10)
6

self.etat_bouton est un dictionnaire qui sera utilisé indiquer quelle image est affichée sur le wx.BitmapButton, False pour l'image 1.png ou True pour l'image 2.png.

La création des objets wx.BitmapButton se fait dans une boucle for. en appelant le constructeur wx.BitmapButton avec i pour valeur du paramètre nommé id. L'image associée au est donnée dans le paramètre nommé bmp, self.bmp1.

Le gestionnaire d'événement self.OnBouton est associé au bouton en appelant Bind

Le bouton est ajouté à l'objet self.ma_grille en appelant la méthode Add de la classe wx.Sizer (classe de base de wx.GridSizer).

Le dictionnaire de l'état du bouton est construit ; si le dictionnaire est vide (==None) alors une première clef est créée pour la valeur i égale à False. S'il n'est pas vide les autres clefs sont créées en utilisant l'opérateur d'indexation [ ].

1
        self.etat_bouton = None
2
        for i in range(nb_boutons):
3
            bouton = wx.BitmapButton(self, id=i, bitmap=self.bmp1)
4
            bouton.Bind(wx.EVT_BUTTON, self.OnBouton)            
5
            self.ma_grille.Add(bouton, i,wx.EXPAND)
6
            if self.etat_bouton == None:
7
                self.etat_bouton={i: False}
8
            else:
9
                self.etat_bouton[i] = False
10

Le gestionnaire d'événement utilise le dictionnaire self.etat_bouton ; la clef est extraite en appelant la méthode GetId de la classe wx.Event. L'image du bouton est modifiée en fonction de la valeur de la clef en appelant la méthode SetBitmapLabel avec comme objet la valeur retournée méthode GetEventObject de la classe wx.Event

1
    def OnBouton(self, event):
2
        if event.GetId() in self.etat_bouton:
3
            bouton = event.GetEventObject()
4
            if not self.etat_bouton[event.GetId()]:
5
                self.etat_bouton[event.GetId()] = True
6
                bouton.SetBitmapLabel(self.bmp2)
7
            else:
8
                self.etat_bouton[event.GetId()] = False
9
                bouton.SetBitmapLabel(self.bmp1)
10

Le programme complet est ici :

1
import wx
2
import os
3
4
class MaFenetre(wx.Frame):    
5
    def __init__(self):
6
        chemin_script = os.path.dirname(os.path.realpath(__file__))
7
        super().__init__(parent=None, title='Ma fenêtre avec BitmapButton')
8
        self.bmp1 = wx.Bitmap(chemin_script+"\\1.png", wx.BITMAP_TYPE_PNG) 
9
        self.bmp2 = wx.Bitmap(chemin_script+"\\2.png", wx.BITMAP_TYPE_PNG) 
10
        nb_boutons = 16
11
        self.ma_grille = wx.GridSizer(rows=4, cols=4, vgap=10, hgap=10)
12
        font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
13
            wx.FONTWEIGHT_BOLD)
14
        self.etat_bouton = None
15
        for i in range(nb_boutons):
16
            bouton = wx.BitmapButton(self, id=i, bitmap=self.bmp1)
17
            bouton.SetFont(font)
18
            bouton.Bind(wx.EVT_BUTTON, self.OnBouton)            
19
            self.ma_grille.Add(bouton, i,wx.EXPAND)
20
            if self.etat_bouton == None:
21
                self.etat_bouton={i: False}
22
            else:
23
                self.etat_bouton[i] = False
24
        self.SetSizerAndFit(self.ma_grille)        
25
        self.Show()
26
27
    def OnBouton(self, event):
28
        if event.GetId() in self.etat_bouton:
29
            bouton = event.GetEventObject()
30
            if not self.etat_bouton[event.GetId()]:
31
                self.etat_bouton[event.GetId()] = True
32
                bouton.SetBitmapLabel(self.bmp2)
33
            else:
34
                self.etat_bouton[event.GetId()] = False
35
                bouton.SetBitmapLabel(self.bmp1)
36
37
       
38
if __name__ == '__main__':
39
    app = wx.App()
40
    frame = MaFenetre()
41
    app.MainLoop()
42