Je me bats avec mon PC et un Mac (pas les mêmes versions de python et de wx) pour sortir un notebook qui aurait différents onglets dont une feuille Grid.
Je n'y parviens pas. En plus, la version dans la démo ne passe pas sur mes machines (l'import me dit qu'il manque toujours quelque chose: GridSimple,...).
Une bonne âme peut-elle m'aider en corrigeant l'exemple suivant (adapté de celui d'Alain72) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#-*- coding: iso-8859-15 -*-
import wx
##try:
##    import GridSimple
##except ImportError:
##    raise ImportError, "GridSimple non disponible"
import wx.grid as gridlib
 
# Constantes d'ID des cases à cocher du menu
CHK_ROUGE = 101
CHK_BLEU = 102
CHK_VERT = 103
 
class Onglets(wx.Notebook):
    # Classe dérivée du wx.Notebook
    def __init__(self, parent):
        wx.Notebook.__init__(self, parent, -1)
 
    def AjoutePage(self, couleur, nom):
        # Méthode d'ajout d'un onglet au notebook
        # On crée une fenêtre (là de type wx.Panel) qui servira de page
        win = wx.Panel(self, -1)
        win.SetBackgroundColour(couleur)
        # On ajoute cette fenêtre au notebook
        # en lui donnant le titre de l'onglet
        self.AddPage(win, nom)
 
    def SupprimePage(self, index):
        # Méthode de suppression d'un onglet
        self.DeletePage(index)
 
 
class SimpleGrid(gridlib.Grid): ##, mixins.GridAutoEditMixin):
    def __init__(self, parent):
        gridlib.Grid.__init__(self, parent, -1)
        ##mixins.GridAutoEditMixin.__init__(self)
        #self.log = log
        self.moveTo = None
 
        #self.Bind(wx.EVT_IDLE, self.OnIdle)
 
        self.CreateGrid(10, 10)#, gridlib.Grid.SelectRows)
 
    def AjoutePage(self, couleur, nom):
        # Méthode d'ajout d'un onglet au notebook
        # On crée une fenêtre (là de type wx.Panel) qui servira de page
        win = wx.Panel(self, -1)
        #win.SetBackgroundColour(couleur)
        # On ajoute cette fenêtre au notebook
        # en lui donnant le titre de l'onglet
        #self.AddPage(win, nom)
 
class Fenetre(wx.Frame):
    # Frame destinée à tester notre notebook
    def __init__(self):
        wx.Frame.__init__(self, None, -1, title = "Test Notebook", size = (500, 400))
 
        # Barre de menu comprenant un menu de trois cases à cocher
        menubar = wx.MenuBar()
        menu = wx.Menu()
        menu.AppendCheckItem(CHK_ROUGE, "Page rouge")
        menu.AppendCheckItem(CHK_BLEU, "Page bleue")
        menu.AppendCheckItem(CHK_VERT, "Page verte")
        menubar.Append(menu, "Onglets")
        self.SetMenuBar(menubar)
        menu.Check(CHK_ROUGE, True)
        menu.Check(CHK_BLEU, True)
        menu.Check(CHK_VERT, True)
 
        # Instanciation de notre classe Notebook
        self.notebook = Onglets(self)
        # Instanciation de la classe SimpleGrid
        self.notebook= SimpleGrid(self)
        # Ajout de trois onglets dans le notebook
        self.notebook.AjoutePage(wx.RED, "Rouge")
        self.notebook.AjoutePage(wx.BLUE, "Bleu")
        self.notebook.AjoutePage(wx.GREEN, "Vert")
        #magrille=SimpleGrid(self)
        self.notebook.AjoutePage(wx.WHITE,SimpleGrid)
 
 
        # Ajout d'une barre d'état à deux champs
        self.etat = wx.StatusBar(self, -1)
        self.etat.SetFieldsCount(2)
        self.SetStatusBar(self.etat)
 
        # On amorce le gestionnaire d'évènements du notebook
        # 1- Pour celui qui intervient après le changement d'onglet
        self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnChanged)
        # 2- Pour celui qui intervient au moment du changement d'onglet
        self.notebook.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnChanging)
        # Puis celui du Menu
        self.Bind(wx.EVT_MENU, self.OnMenu)
 
    def OnChanged(self, evt):
        # On récupère l'index de la nouvelle page pour l'insérer
        # dans un message
        index = evt.GetSelection()
        message = "On se positionne sur l'onglet n° %s"%index
        # On affiche le message dans la zone 2 de la barre d'état
        self.etat.SetStatusText(message, 1)
        # On laisse l'action se dérouler
        evt.Skip()
 
    def OnChanging(self, evt):
        # On récupère l'index de la page quittée pour l'insérer
        # dans un message
        index = evt.GetSelection()
        message = "On quitte l'onglet n° %s"%index
        # On affiche le message dans la zone 1 de la barre d'état
        self.etat.SetStatusText(message, 0)
        # On laisse l'action se dérouler
        evt.Skip()
 
    def OnMenu(self, evt):
        # On recupère l'ID de l'item de menu cliqué
        # Pour alimenter les variables couleur et nom
        if evt.GetId() == CHK_ROUGE :
            couleur = wx.RED
            nom = "Rouge"
        elif evt.GetId() == CHK_BLEU:
            couleur = wx.BLUE
            nom = "Bleu"
        else :
            couleur = wx.GREEN
            nom = "Vert"
 
        # On teste alors si le clic a eu pour conséquence de cocher le menu
        if evt.IsChecked():
            # Si oui, on ajoute un onglet avec un panel de la couleur indiquée
            self.notebook.AjoutePage(couleur, nom)
        else:
            # Si non, on recherche l'index de l'onglet de la même couleur
            for x in range(self.notebook.GetPageCount()):
                if self.notebook.GetPageText(x) == nom :
                    pos = x
                    # Et on le supprime
                    self.notebook.SupprimePage(pos)
        # On laisse l'action se dérouler
        evt.Skip()
 
class App(wx.App):
    def OnInit(self):
        f = Fenetre()
        f.Show(True)
        self.SetTopWindow(f)
        return True
 
if __name__ == "__main__":
    monApp = App()
    monApp.MainLoop()
Merci d'avance

PS: je viens de commander sur Amazon le bouquin wx in action qui m'a l'air bien fait (j'ai lu les 2 chapîtres en accès libre) mais j'ai besoin d'avancer d'ici sa réception.