Positionner les boutons (ou contrôles)
Rappel :
Pour positionner et fixer la taille des boutons dans la fenêtre mère, les paramètres nommés size
et pos
sont utilisés :
wx.Button(self, id=1000, label='X', pos=(20, 25),size=(50,20))
Méthode : Positionnement automatique des boutons (ou contrôles)
Il est possible de placer régulièrement les contrôles régulièrement dans une fenêtre en utilisant les Sizer
(calibre). Il existe plusieurs types de Sizer
, BoxSizer
, GridSizer
, FlexGridSizer
.
Exemple : Placement de 16 boutons dans une grille de 4 lignes et 4 colonnes
Cet exemple crée une classe MaFenetre
. Le constructeur de MaFenetre
crée 16 boutons. Pour positionner ces boutons dans la fenêtre, un objet wx.GridSizer
, nommé self.ma_grille
, est instancié avec 4 lignes et 4 colonnes et une séparation horizontale et verticale de 10 entre chaque éléments.
Un objet wx.Font
(police de caractère) de taille 20 est crée.
import wx
class MaFenetre(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Ma fenêtre avec bouton')
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)
La création des objets wx.Button
se fait dans une boucle for. L'objet wx.Font est associé à chaque bouton en utilisant la méthode SetFont
de la classe wx.Button
.
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 premier paramètre de la méthode Add
est le bouton suivi de l'indice de ce bouton dans le Sizer
et enfin un drapeau indiquant que la taille du contrôle est modifiable (ici le bouton).
for i in range(nb_boutons):
bouton = wx.Button(self, label='X')
bouton.SetFont(font)
bouton.Bind(wx.EVT_BUTTON, self.OnBouton)
self.ma_grille.Add(bouton, i,wx.EXPAND)
Pour terminer, le Sizer
est associé à la fenêtre et celle-ci est dimensionné pour que tous les contrôles ajoutés au Sizer
soit visible : méthode SetSizerAndFit
de la classe wx.Frame
.
self.SetSizerAndFit(self.ma_grille)
self.Show()
Le programme complet est ici :
import wx
class MaFenetre(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Ma fenêtre avec bouton')
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)
for i in range(nb_boutons):
bouton = wx.Button(self, label='X')
bouton.SetFont(font)
bouton.Bind(wx.EVT_BUTTON, self.OnBouton)
self.ma_grille.Add(bouton, i,wx.EXPAND)
self.SetSizerAndFit(self.ma_grille)
self.Show()
def OnBouton(self, event):
bouton = event.GetEventObject()
s = bouton.GetLabel()
if s == "X":
bouton.SetLabel("O")
elif s == "O":
bouton.SetLabel("X")
if __name__ == '__main__':
app = wx.App()
frame = MaFenetre()
app.MainLoop()