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 :

1
wx.Button(self, id=1000, label='X', pos=(20, 25),size=(50,20))

MéthodePositionnement 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.

ExemplePlacement 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.

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
        nb_boutons = 16
8
        self.ma_grille = wx.GridSizer(rows=4, cols=4, vgap=10, hgap=10)
9
        font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
10
            wx.FONTWEIGHT_BOLD)
11

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).

1
        for i in range(nb_boutons):
2
            bouton = wx.Button(self,  label='X')
3
            bouton.SetFont(font)
4
            bouton.Bind(wx.EVT_BUTTON, self.OnBouton)            
5
            self.ma_grille.Add(bouton, i,wx.EXPAND)          
6

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.

1
        self.SetSizerAndFit(self.ma_grille)        
2
        self.Show()
3

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
        nb_boutons = 16
8
        self.ma_grille = wx.GridSizer(rows=4, cols=4, vgap=10, hgap=10)
9
        font = wx.Font(20, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL,
10
            wx.FONTWEIGHT_BOLD)
11
        for i in range(nb_boutons):
12
            bouton = wx.Button(self,  label='X')
13
            bouton.SetFont(font)
14
            bouton.Bind(wx.EVT_BUTTON, self.OnBouton)            
15
            self.ma_grille.Add(bouton, i,wx.EXPAND)          
16
           
17
        self.SetSizerAndFit(self.ma_grille)        
18
        self.Show()
19
20
    def OnBouton(self, event):
21
        bouton = event.GetEventObject()
22
        s = bouton.GetLabel()
23
        if s == "X":
24
            bouton.SetLabel("O")
25
        elif s == "O":
26
            bouton.SetLabel("X")
27
       
28
if __name__ == '__main__':
29
    app = wx.App()
30
    frame = MaFenetre()
31
    app.MainLoop()
32