Coucou à tous ! C'est encore moi, avec une nouvelle colle à vous poser

Alors voilà je dispose maintenant de mes grilles placées sur mon notebook, à ce niveau là pas de problème.

Je veux maintenant lors d'une sélection dans un menu déroulant (wxcombobox), lorsque celui ci renvoi un évènement de sélection (wx.EVT_COMBOBOX) créer une deuxième combobox dans un sizer...

Et c'est là que ça se complique, la 2nde combobox se crée bien lors d'une sélection dans la 1ere, cependant elle ne se met pas dans le sizer, je ne comprends pas du tout pourquoi...Ce qui fait que j'obtiens mon menu déroulant 1, je fais ma selection, un deuxieme menu se crée mais son sizer reste en haut à gauche !!!! Besoin d'aide svp

Voici le bout de code concerné :

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
class PageUn(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
         ComboOuv=open(ComboDir,'r')
         exec(ComboOuv)
         ComboOuv.close()
         BoxPays = wx.ComboBox(self,100,"Choix du pays",(100, 50), 
                         (200, -1),ListePays,wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT)
         box = wx.StaticBox(self, -1, "Selectionnez un pays :")
         sizer1 = wx.StaticBoxSizer(box, wx.HORIZONTAL)
         sizer1.Add(BoxPays, 1, wx.CENTRE|wx.ALL, 10)
         mainSizer = wx.BoxSizer(wx.HORIZONTAL)
         mainSizer.Add(sizer1, 0,wx.ALL, 10)
         self.SetSizer(mainSizer)
         self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, BoxPays)
 
 
     def EvtComboBox(self,event):
         ComboOuv=open(ComboDir,'r')
         exec(ComboOuv)
         ComboOuv.close()
         BoxRegion = wx.ComboBox(self,100,"Choix Region",(100, 100), 
                         (200, -1),ListePays,wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT)
         box2 = wx.StaticBox(self, -1, "Selectionnez une région :")
         sizer2 = wx.StaticBoxSizer(box2, wx.HORIZONTAL)
         sizer2.Add(BoxRegion, 1, wx.CENTRE|wx.ALL, 10)
Et le code complet (toujours plus simple pour tester ) :

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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# -*- coding: cp1252 -*-
import  wx #importe le module graphique wx
#import wx.aui
import time #importe module de temps
import Tkinter #importe la bibliotheque Tkinter.
import sys #importes fonctions systeme
import pickle #importe module d'encodage propre a python
import os #importe fonctions de l'OS
from os import getcwd #importe la fonction qui recupere le chemin du repertoire courrant.
import  wx.grid             as  gridlib #Importe le module de la grille sous le nom "gridlib".
import  wx.lib.printout as  printout #importe module d'impression.
from os.path import * #importe les objets de la classe path.
import gadfly #Module BDD Locale
 
#--Declaration-des-Variables--------------
ComboDir=(getcwd()+"\\Params\\ComboListe.ini")#Chemin des ComboBox
HeureOrdi = time.localtime(time.time()) #Fonction pour recupérer l'heure et la date courrante.
HeureAffiche = time.strftime("%d-%b-%Y",HeureOrdi) #Affiche la date au format voulu.
LongScr=wx.SYS_SCREEN_X #Variable qui renvoie la longueur de l'ecran
LargScr=wx.SYS_SCREEN_Y #Variable qui renvoie la hauteur de l'ecran
SaveDir = (getcwd()+"\\Save") #Definition d'un chemin pour la creation du repertoire "Sauvegardes" (voir plus bas "VerCreateSauv")
SaveData = (SaveDir + "\\Data.sav") #Chemin du fichier Donnees.sav pour 1er remplissage dela grille.
RepBDD = (getcwd()+"\\BDD")
 
#-------BDD-----------------------
baseDonn = gadfly.gadfly()
baseDonn.startup("maBDD",RepBDD)
cur = baseDonn.cursor()
cur.execute("create table FichePays (nom varchar)")
#cur.execute("insert into membres(age, nom, taille) values (21,'Dupont',1.83)")
baseDonn.commit()
 
 
#---Identifiants-du-Menu-------------
ID_NOUVEAU      = wx.NewId()
ID_OUVRIR       = wx.NewId()
ID_SAUVER       = wx.NewId()
ID_SAUVERSOUS   = wx.NewId()
ID_QUITTER      = wx.NewId()
ID_STANDARD     = wx.NewId()
ID_PERSO        = wx.NewId()
ID_FULLSCREEN   = wx.NewId()
 
#---------Permet de créer le dossier sauvegarde au lancement du programme---------
if exists(SaveData): #Verifie que le fichier "Data.sav" existe.
    pass #Si oui il ne fait rien et continue
else : #Sinon
     if exists(SaveDir): #Verifie si le dossier "Save" a déjà été crée.
          pass
     else:
         os.mkdir(SaveDir) #Crée le repertoire "Sauvegardes" s'il n'existe pas.
 
class PageUn(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
         ComboOuv=open(ComboDir,'r')
         exec(ComboOuv)
         ComboOuv.close()
         BoxPays = wx.ComboBox(self,100,"Choix du pays",(100, 50), 
                         (200, -1),ListePays,wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT)
         box = wx.StaticBox(self, -1, "Selectionnez un pays :")
         sizer1 = wx.StaticBoxSizer(box, wx.HORIZONTAL)
         sizer1.Add(BoxPays, 1, wx.CENTRE|wx.ALL, 10)
         mainSizer = wx.BoxSizer(wx.HORIZONTAL)
         mainSizer.Add(sizer1, 0,wx.ALL, 10)
         self.SetSizer(mainSizer)
         self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, BoxPays)
 
 
     def EvtComboBox(self,event):
         ComboOuv=open(ComboDir,'r')
         exec(ComboOuv)
         ComboOuv.close()
         BoxRegion = wx.ComboBox(self,100,"Choix Region",(100, 100), 
                         (200, -1),ListePays,wx.CB_DROPDOWN|wx.CB_READONLY|wx.CB_SORT)
         box2 = wx.StaticBox(self, -1, "Selectionnez une région :")
         sizer2 = wx.StaticBoxSizer(box2, wx.HORIZONTAL)
         sizer2.Add(BoxRegion, 1, wx.CENTRE|wx.ALL, 10)
 
 
 
class PageDeux(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
         t = wx.StaticText(self, -1, "Ceci est l'objet Page 2", (40,40))
 
 
class PageTrois(wx.Panel):
     def __init__(self, parent):
         wx.Panel.__init__(self, parent)
         grid1 = Grille1(self,parent,size=(200,250))
         grid2 = Grille2(self,parent,size=(235,150))
#--------Sizer Grid 1--------------
         box = wx.StaticBox(self, -1, "Titre Grid 1:")
         sizer1 = wx.StaticBoxSizer(box, wx.HORIZONTAL)
         sizer1.Add(grid1, 1, wx.CENTRE|wx.ALL, 10)
#------------Sizer grid 2---------
         box2 = wx.StaticBox(self, -1, "Titre Grid 2:")
         sizer2 = wx.StaticBoxSizer(box2, wx.HORIZONTAL)
         sizer2.Add(grid2, 1, wx.CENTRE|wx.ALL, 10)
         mainSizer = wx.BoxSizer(wx.HORIZONTAL)
         mainSizer.Add(sizer1, 0,wx.ALL, 10)
         mainSizer.Add(sizer2,0,wx.ALL,10)
         self.SetSizer(mainSizer)
 
#class SelectionPays(wx.Panel):
    #def __init__(self,parent):
        #wx.Panel.__init__(self,parent)
 
 
class MainFrame(wx.Frame):
     def __init__(self):
         wx.Frame.__init__(self, None, title="Projet Standard V0.0",size=(800,600))
         global nb,BoxPays
         self.Maximize()
         self.Menu()#Crée le menu.
         self.Center()#Centre la frame
         self.CreerBarreEtat() #Crée la barre d'état (en bas).
         # On crée un panel avec un Notebook dessus
         p = wx.Panel(self)
         nb = wx.Notebook(p)
         # On met le tout dans un sizer
         sizer = wx.BoxSizer()
         sizer.Add(nb, 1, wx.EXPAND)
         p.SetSizer(sizer)
         #selpays = SelectionPays(self)
 
     def Menu(self):
#-----------------Definition de menu fichier
         self.menufichier = wx.Menu()
         self.sousmenu = wx.Menu()
         self.sousmenu.Append(ID_STANDARD,"&Projet Standard\tCTRL+N","Nouveau projet standard")
         self.sousmenu.Append(ID_PERSO,"&Projet Perso\tCTRL+P","Nouveau projet personnalisé")
         self.menufichier.AppendMenu(ID_NOUVEAU,"&Nouveau",self.sousmenu)
         self.menufichier.Append(ID_OUVRIR,"&Ouvrir\tCTRL+O","Ouvrir un fichier existant")
         self.menufichier.Append(ID_SAUVER,"&Sauver\tCTRL+S","Enregistrer le fichier")
         self.menufichier.Append(ID_SAUVERSOUS,"&Sauver sous\tCTRL+E","Enregistrer sous un autre nom")
         self.menufichier.Append(ID_QUITTER,"&Quitter\tCTRL+Q","Quitter l'application")
#----------Definition des gestionnaires d'evenements lies au menu
         #wx.EVT_MENU(self,ID_NOUVEAU,self.Nouveau)
         #wx.EVT_MENU(self,ID_OUVRIR,self.Ouverture)
         #wx.EVT_MENU(self,ID_SAUVER,self.Sauvegarde)
         #wx.EVT_MENU(self,ID_SAUVERSOUS,self.SauvegardeSous)
         wx.EVT_MENU(self,ID_STANDARD,self.ProjetStandard)
         wx.EVT_MENU(self,ID_QUITTER,self.Termine)
#-----------------Definition de la barre de menu et insertion des menus
         self.menubar = wx.MenuBar()
         self.menubar.Show(True)
         self.menubar.Append(self.menufichier,"&Fichier")
         self.SetMenuBar(self.menubar)
 
     def ProjetStandard(self,event):
# On crée les pages dérivées du Notebook
         page1 = PageUn(nb)
         #page2 = PageDeux(nb)
         #page3 = PageTrois(nb)
# On ajoute les onglets et leurs titres
         nb.AddPage(page1, "Definition zone Geo")
         #nb.AddPage(page2, "Onglet 2")
         #nb.AddPage(page3, "Page 3") 
 
     def Chrono(self):#Chronometre (date et heure)
         temps = time.localtime(time.time()) #Recupere la date et l'heure.
         stemps = time.strftime("%d-%b-%Y %H:%M:%S",temps) #Definit le format voulu.
         self.SetStatusText(stemps,1) #Affiche a chaque seconde.
 
     def CreerBarreEtat(self):#Creation de la barre d'etat du bas avec l'affichage de l'heure et date
         self.CreateStatusBar(2) #Cree une barre de statut (en bas) de deux parties.
         self.SetStatusWidths([-1,150]) #Definit la taille.
         self.timer = wx.PyTimer(self.Chrono) #Cree le timer.
         self.timer.Start(10) #Lance le timer.
         self.Chrono()#Affiche.
 
     def Termine(self,event):
         self.Destroy() #Detruit l'objet wx.Frame (detruit la frame).
 
class Grille1(gridlib.Grid):#Classe de création de la grille
    def __init__(self,parent,pos,size):
        gridlib.Grid.__init__(self,parent,pos=(50,50),size=(200,250))
        self.CreateGrid(5,2)#Creation de la grille
        #self.SetLabelTextColour("violet") #Couleur du texte .
        #self.SetColLabelAlignment(wx.ALIGN_CENTER, wx.ALIGN_BOTTOM) #Aligne les labels au centre en bas de la cellule.
        self.DisableDragGridSize()#Empeche de redimensionner les cases avec la souris
        #self.EnableEditing(True)#Si FALSE Met TOUTE la grid en READ ONLY !
        self.SetReadOnly(4,1,True) #Mets la case spécifiée en read only
        self.SetCellValue(4,1,"Read Only")
        self.SetRowLabelSize(0)#Enleve label des lignes
        self.SetColLabelSize(0)#Enleve Label des Col
        self.SetScrollLineY(1)#Enleve scroll vertical
        self.SetScrollLineX(1)#Enleve scroll horiz
        self.SetGridLineColour(wx.BLACK)
 
#---Fait une case d'une ligne et 2 colonnes....
        self.SetCellSize(0, 0, 1, 2);
        self.SetCellEditor(0, 0, wx.grid.GridCellAutoWrapStringEditor())#Multiligne
 
#-----------Aller prendre couleurs dans wx colourdatabase--------
        self.SetDefaultCellBackgroundColour("WHITE")#Couleur du fond des cases
        self.SetDefaultCellTextColour(wx.BLACK)
 
#-----------------ComboBox-------------------------------------
        ComboOuv=open(ComboDir,'r') #Ouvre ComboListe1.ini en "read"
        exec(ComboOuv) #Execute ComboListe.ini
        ComboOuv.close() #Ferme ComboListe.ini
        Choixbox = wx.grid.GridCellChoiceEditor(combo1, False) 
        self.SetCellEditor(1, 1, Choixbox)
        self.SetCellValue(1,1,"OUI")#Triche pour 1ere valeur...Inutile (?)
 
#-------------------Ajuste la taille des cases du Grid
        NumCols = self.GetNumberCols()#Compte le nombre de colonnes du Grid
        NumLignes = self.GetNumberRows()#Compte le nombre de lignes du Grid
        x=0
        y=0
        while (x<NumLignes) :
            self.SetCellAlignment(x, 0, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.SetCellAlignment(x, 1, wx.ALIGN_CENTRE, wx.ALIGN_CENTRE)
            self.SetCellFont(x,0,wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))#Police col 1
            self.SetCellFont(x,1,wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD))#Police col 2
            self.SetRowSize(x,50)
            x+=1
            while(y<NumCols):
                self.SetColSize(y,100)
                y+=1
 
 
#--------Empeche l'overflow-----------------              
        attr=gridlib.GridCellAttr()
        attr.SetOverflow(False)
        x=0
        while(x<NumCols):
            self.SetColAttr(x,attr)
            x+=1
 
class Grille2(gridlib.Grid):#Classe de création de la grille
    def __init__(self,parent,pos,size):
        gridlib.Grid.__init__(self,parent,pos=(400,50),size=(235,150))
        self.CreateGrid(5,2)#Creation de la grille
        self.SetColLabelAlignment(wx.ALIGN_CENTER, wx.ALIGN_BOTTOM) #Aligne les labels au centre en bas de la cellule.
        self.DisableDragGridSize()
 
if __name__ == "__main__":
     app = wx.App()
     MainFrame().Show()
     app.MainLoop()
Merci d'avance à ceux/celles qui m'aideront !