Bouton avec image (BitmapButton)
Définition : wx.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 :
L'appel à os.path.realpath
suivi de os.path.dirname
permet d'obtenir le chemin du script python (votre programme !)
import wx
import os
class MaFenetre(wx.Frame):
def __init__(self):
chemin_script = os.path.dirname(os.path.realpath(__file__))
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.
super().__init__(parent=None, title='Ma fenêtre avec BitmapButton')
self.bmp1 = wx.Bitmap(chemin_script+"\\1.png", wx.BITMAP_TYPE_PNG)
self.bmp2 = wx.Bitmap(chemin_script+"\\2.png", wx.BITMAP_TYPE_PNG)
nb_boutons = 16
self.ma_grille = wx.GridSizer(rows=4, cols=4, vgap=10, hgap=10)
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 [ ]
.
self.etat_bouton = None
for i in range(nb_boutons):
bouton = wx.BitmapButton(self, id=i, bitmap=self.bmp1)
bouton.Bind(wx.EVT_BUTTON, self.OnBouton)
self.ma_grille.Add(bouton, i,wx.EXPAND)
if self.etat_bouton == None:
self.etat_bouton={i: False}
else:
self.etat_bouton[i] = False
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
def OnBouton(self, event):
if event.GetId() in self.etat_bouton:
bouton = event.GetEventObject()
if not self.etat_bouton[event.GetId()]:
self.etat_bouton[event.GetId()] = True
bouton.SetBitmapLabel(self.bmp2)
else:
self.etat_bouton[event.GetId()] = False
bouton.SetBitmapLabel(self.bmp1)
Le programme complet est ici :
import wx
import os
class MaFenetre(wx.Frame):
def __init__(self):
chemin_script = os.path.dirname(os.path.realpath(__file__))
super().__init__(parent=None, title='Ma fenêtre avec BitmapButton')
self.bmp1 = wx.Bitmap(chemin_script+"\\1.png", wx.BITMAP_TYPE_PNG)
self.bmp2 = wx.Bitmap(chemin_script+"\\2.png", wx.BITMAP_TYPE_PNG)
nb_boutons = 16
self.ma_grille = wx.GridSizer(rows=4, cols=4, vgap=10, hgap=10)
font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
wx.FONTWEIGHT_BOLD)
self.etat_bouton = None
for i in range(nb_boutons):
bouton = wx.BitmapButton(self, id=i, bitmap=self.bmp1)
bouton.SetFont(font)
bouton.Bind(wx.EVT_BUTTON, self.OnBouton)
self.ma_grille.Add(bouton, i,wx.EXPAND)
if self.etat_bouton == None:
self.etat_bouton={i: False}
else:
self.etat_bouton[i] = False
self.SetSizerAndFit(self.ma_grille)
self.Show()
def OnBouton(self, event):
if event.GetId() in self.etat_bouton:
bouton = event.GetEventObject()
if not self.etat_bouton[event.GetId()]:
self.etat_bouton[event.GetId()] = True
bouton.SetBitmapLabel(self.bmp2)
else:
self.etat_bouton[event.GetId()] = False
bouton.SetBitmapLabel(self.bmp1)
if __name__ == '__main__':
app = wx.App()
frame = MaFenetre()
app.MainLoop()