]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
CCAR: correction de problemes avec les parametres
authorChristian Caremoli <>
Wed, 4 Nov 2009 17:27:33 +0000 (17:27 +0000)
committerChristian Caremoli <>
Wed, 4 Nov 2009 17:27:33 +0000 (17:27 +0000)
1- un parametre detruit continue a etre utilise par les commandes suivantes (corrige)
2- un parametre qui change de valeur ne modifie pas le statut si necessaire (corrige)

plus un probleme avec la commande DETRUIRE et la destruction de concept : une recursion
malencontreuse dans fin_modif produisait un comportement incomprehensible (corrige)

Remplacement de quelques appels a place() par des appels a grid() pour un meilleur placement.

Extensions/parametre.py
Ihm/I_ETAPE.py
Ihm/I_MCCOMPO.py
Ihm/I_MCLIST.py
Ihm/I_MCSIMP.py
InterfaceTK/compoparam.py
InterfaceTK/panels.py
InterfaceTK/plusieursbasepanel.py
InterfaceTK/uniquebasepanel.py
InterfaceTK/widgets.py

index 58ceefa2f4f128493252edb4e0ea0be1d1aa3f12..2c3ed69898900c7745192eb02d1d8e0aaae33979 100644 (file)
@@ -130,6 +130,7 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
     Remplace la valeur de self par new_valeur interprétée
     """
     self.valeur = self.interprete_valeur(new_valeur)
+    self.parent.update_concept_after_etape(self,self)
     self.init_modif()
 
   def set_nom(self,new_nom):
@@ -249,6 +250,7 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
     paramètres du JDC
     """
     self.jdc.delete_param(self)
+    self.parent.delete_concept(self)
 
   def update_context(self,d):
     """
index a4648fd2648279f9b7ee773c3e5a4681bbe535e2..809fa3d522339c3eb8d59cfdbeee57670fb49965 100644 (file)
@@ -83,17 +83,8 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
           Méthode appelée une fois qu'une modification a été faite afin de 
           déclencher d'éventuels traitements post-modification
           ex : INCLUDE et POURSUITE
+          Ne pas mettre de traitement qui risque d'induire des recursions (soit a peu pres rien)
       """
-      #print "fin_modif",self,self.parent
-      if self.nom == "DETRUIRE":
-         #Il n'est pas conseillé de mettre des traitements dans fin_modif. Ceci est une
-         # exception qu'il faut supprimer à terme.
-         #une commande DETRUIRE a été modifiée. Il faut verifier les commandes
-         #suivantes
-         #ATTENTION: aux eventuelles recursions
-         self.parent.control_context_apres(self)
-         pass
-
       CONNECTOR.Emit(self,"valid")
       if self.parent:
         self.parent.fin_modif()
@@ -424,6 +415,11 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
 
       return commande_comment
 
+   def modified(self):
+      """Le contenu de l'etape (mots cles, ...) a ete modifie"""
+      if self.nom=="DETRUIRE":
+        self.parent.control_context_apres(self)
+
      
 #ATTENTION SURCHARGE: a garder en synchro ou a reintegrer dans le Noyau
    def Build_sd(self,nom):
index 183a104e3bc4a6cb6b25fc49e400bd6c29a2980a..f9b03c339ca81e128781062d4bc9419340d702c7 100644 (file)
@@ -186,6 +186,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
     objet.delete_mc_global()
     objet.update_condition_bloc()
     objet.supprime()
+    self.etape.modified()
     self.fin_modif()
     return 1
 
index 7f94e66e5b5fb26bfd0689eca5cef1169d518917..4627bf5502d606990877c139f846c5ac8e972449 100644 (file)
@@ -79,6 +79,7 @@ class MCList:
       CONNECTOR.Emit(self,"supp",obj)
       self.update_condition_bloc()
       obj.supprime()
+      self.etape.modified()
       self.fin_modif()
       return 1
 
index a6794ed8d426b359ffa36a09f7acac6f54aefe48..9abb391f57a4b06d28cf14491bc88b86440dfd57 100644 (file)
@@ -283,6 +283,7 @@ class MCSIMP(I_OBJECT.OBJECT):
         self.valeur = new_valeur
         self.val = new_valeur
         self.update_condition_bloc()
+        self.etape.modified()
         self.fin_modif()
         return 1
 
@@ -366,9 +367,13 @@ class MCSIMP(I_OBJECT.OBJECT):
 
   def update_concept(self,sd):
     if type(self.valeur) in (types.ListType,types.TupleType) :
-       if sd in self.valeur:self.fin_modif()
+       if sd in self.valeur:
+         self.init_modif()
+         self.fin_modif()
     else:
-       if sd == self.valeur:self.fin_modif()
+       if sd == self.valeur:
+         self.init_modif()
+         self.fin_modif()
 
   def delete_concept(self,sd):
     """ 
index 80094ad397dacbb8e1258647a1f668a5649fb876..984df83034b51e792d06ccc0fb397caf4facbb28 100644 (file)
@@ -71,19 +71,15 @@ class PARAMPanel(panels.OngletPanel):
     Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
     """
     self.frame_valeur = Frame(page)
-    #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
     self.frame_valeur.pack(expand=1)
     # affichage du titre du panneau
     self.titre = StringVar()
     self.titre.set("PARAMETRE "+self.node.item.get_nom())
-    #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
     Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
     # création des labels et entries associés aux nom et valeur du paramètre
-    #Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
-    Label(self.frame_valeur,text= 'Nom du paramètre : ').grid(row=1,sticky=W,padx=5,pady=5)
+    Label(self.frame_valeur,text= 'Nom du paramètre : ',justify=LEFT).grid(row=1,sticky=W,padx=5,pady=5)
     self.entry_nom = Entry(self.frame_valeur)
-    #Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
-    Label(self.frame_valeur,text= 'Valeur du paramètre : ').grid(row=2,sticky=W,padx=5,pady=5)
+    Label(self.frame_valeur,text= 'Valeur du paramètre : ',justify=LEFT).grid(row=2,sticky=W,padx=5,pady=5)
     self.entry_val = Entry(self.frame_valeur)
     # binding sur entry_nom
     self.entry_nom.bind("<Return>",lambda e,s=self : s.entry_val.focus())
@@ -91,20 +87,15 @@ class PARAMPanel(panels.OngletPanel):
     self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.entry_val.focus())
     self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.change_valeur())
     # affichage des entries
-    #self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
     self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
-    #self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
     self.entry_val.grid(row=2,column=1,sticky=W,padx=5,pady=5)
     # affichage d'une phrase d'aide
-    aide = """
-    Un retour de chariot dans une zone de saisie vous permet de vérifier si
-    la valeur que vous avez entrée est valide.
-    Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
-    valeurs seront effectivement prises en compte
-    """
-    #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
-    Label(self.frame_valeur,text=aide).grid(row=3,columnspan=2,padx=5,pady=5)
-    self.frame_valeur.columnconfigure(1,weight=1)
+    aide = """Un retour de chariot dans une zone de saisie vous permet
+de vérifier si la valeur que vous avez entrée est valide.
+Ce n'est qu'après avoir appuyé sur le bouton Valider que les
+nouvelles valeurs seront effectivement prises en compte"""
+    Label(self.frame_valeur,text=aide).grid(row=3,columnspan=2,padx=5,pady=5,sticky=W)
+    #self.frame_valeur.columnconfigure(1,weight=1)
     # affichage des nom et valeur du paramètre
     self.display_valeur()
     self.entry_nom.focus()
index 8932efd3e4b09240a3d5221025795690af503130..b6290ad7585a990c272b146e858e094db603a4cc 100644 (file)
@@ -336,27 +336,28 @@ class OngletPanel(Panel) :
       """
       Crée la page de saisie du nom du concept
       """
-      self.label = Label(page,text='Nom du concept :')
-      self.label.place(relx=0.1,rely=0.4)
+      self.label = Label(page,text='Nom du concept :',justify=LEFT)
+      self.label.grid(row=0,sticky=W,padx=5,pady=10)
       self._any = Entry(page,relief='sunken')
-      self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
+      self._any.grid(row=0,column=1,padx=5,pady=10)
       self._any.bind("<Return>",lambda e,s=self:s.execConcept())
       self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
       self._any.insert(0,self.node.item.GetText())
       self.but_ok=Button(page,text = "Valider",command=self.execConcept)
-      self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
       type_sd = self.node.item.get_type_sd_prod()
+      row=1
       if type_sd :
-          txt = "L'opérateur courant retourne un objet de type %s" %type_sd
+          txt = "L'opérateur courant retourne un objet de type:\n%s" %type_sd
           self.label = Label(page, text = txt)
-          self.label.place(relx=0.5,rely=0.55,anchor='n')
+          self.label.grid(row=1,columnspan=2,padx=5,pady=10,sticky=W)
+          row=2
+      self.but_ok.grid(row=row,columnspan=2,padx=5,pady=10)
       self._any.focus()
       # aide associée au panneau
       bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
       au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
       page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
       page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-        
 
   def makeMoclesPage(self,page):
       """
@@ -482,33 +483,33 @@ class OngletPanel(Panel) :
       self.frame_comment = Frame(page,bd=1,relief='raised')
       self.frame_param   = Frame(page,bd=1,relief='raised')
       self.frame_boutons = Frame(page,bd=1,relief='raised')
-      self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
-      self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
-      self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
       # remplissage de la frame commentaire
-      Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
+      Label(self.frame_comment,text = "Insérer un commentaire :",justify=LEFT).grid(row=0,rowspan=2,sticky=W,padx=5, pady=5)
       but_comment_avant = Button(self.frame_comment,
                                  text = "AVANT "+self.node.item.get_nom(),
                                  command = lambda s=self :s.ajout_commentaire(ind = 'before'))
       but_comment_apres = Button(self.frame_comment,
                                  text = "APRES "+self.node.item.get_nom(),
                                  command = self.ajout_commentaire)
-      but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
-      but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
+      but_comment_avant.grid(row=0,column=1,padx=5, pady=5)
+      but_comment_apres.grid(row=1,column=1,padx=5, pady=5)
+      self.frame_comment.pack(side='top',fill='both',padx=5, pady=5)
       # remplissage de la frame paramètre
-      Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
+      Label(self.frame_param,text = "Insérer un paramètre :",justify=LEFT).grid(row=0,rowspan=2,sticky=W,padx=5, pady=5)
       but_param_avant = Button(self.frame_param,
                                  text = "AVANT "+self.node.item.get_nom(),
                                  command = lambda s=self :s.ajout_parametre(ind = 'before'))
       but_param_apres = Button(self.frame_param,
                                  text = "APRES "+self.node.item.get_nom(),
                                  command = self.ajout_parametre)
-      but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
-      but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
+      but_param_avant.grid(row=0,column=1,padx=5, pady=5)
+      but_param_apres.grid(row=1,column=1,padx=5, pady=5)
+      self.frame_param.pack(side='top',fill='both',padx=5, pady=5)
       # remplissage de la frame boutons
       Button(self.frame_boutons,
              text="Commentariser toute la commande",
-             command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
+             command = self.comment_commande).pack(side='top',padx=5, pady=5)
+      self.frame_boutons.pack(side='top',fill='both',padx=5, pady=5)
     
   def deselectMC(self,name):
       self.parent.appli.affiche_infos('')
index bf3954935c345320e1be60b51b591080ff6816ca..79840ce53e1e84cf6a3843dafcfe714411f829ec 100644 (file)
@@ -105,7 +105,7 @@ class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
       self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
       self.label.place(relx=0.05,rely=0.2)
 
-      # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
+      # Création d'un bouton "Importer ..." et d'un bouton "Parametres" sur le panel.
       bouton_valeurs_fichier = Button(self.frame_choix,
                                       text="Importer",
                                       command=self.select_in_file)
index 847ae02aaae8fca8ce0fc969d421b295dc2f2326..3b083d14e3b6fb4f04fd89d0b2f884a85ce36b7c 100644 (file)
@@ -62,10 +62,8 @@ class UNIQUE_BASE_Panel(UNIQUE_Panel):
       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
       self.label = Label(self.frame_valeur,text='Valeur :')
-      #self.label.place(relx=0.1,rely=0.2)
       self.label.grid(row=0,padx=5,pady=5)
       self.entry = Entry(self.frame_valeur,relief='sunken')
-      #self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
       self.entry.grid(row=0,column=1,padx=5,pady=5)
       self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
       self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
@@ -75,14 +73,11 @@ class UNIQUE_BASE_Panel(UNIQUE_Panel):
                         text = aide,
                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
                         justify='center')
-      #self.aide.place(relx=0.5,rely=0.9,anchor='n')
       self.aide.grid(row=4,columnspan=2,padx=5,pady=5)
       # bouton parametre
       bouton_parametres = Button(self.frame_valeur, text="Parametres", command=self.affiche_parametre)
-      #bouton_parametres.place(relx=0.28,rely=0.5,relwidth=0.4)
       bouton_parametres.grid(row=2,columnspan=2,padx=5,pady=5)
       bouton_val = Button(self.frame_valeur, text="Valider", command=self.valide)
-      #bouton_val.place(relx=0.28,rely=0.6,relwidth=0.4)
       bouton_val.grid(row=3,columnspan=2,padx=5,pady=5)
       # affichage de la valeur du MCS
       self.display_valeur()
index 13a6f92ed695487c96616269df0cf31f037b3d72..a3317959e7d0f733890e4195913ee8affa5620fa 100644 (file)
@@ -69,8 +69,6 @@ class Fenetre :
         # définition des frames
         self.frame_texte = Frame(self.fenetre)
         self.frame_boutons = Frame(self.fenetre)
-        #self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.9)
-        #self.frame_boutons.place(relheight=0.1,relx=0,rely=0.9,relwidth=1.)
         # définition de la zone texte et du scrollbar
         self.zone_texte = Text(self.frame_texte,font=fonte,wrap=wrap,
                                height=height,width=width)
@@ -88,12 +86,10 @@ class Fenetre :
         self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit,
                                 default='active')
         self.but_save = Button(self.frame_boutons,text = "Sauver",command = self.save)
-        #self.but_quit.place(relx=0.4,rely=0.5,anchor='center')
-        #self.but_save.place(relx=0.6,rely=0.5,anchor='center')
         self.but_quit.pack(side='left',padx=25, pady=5)
         self.but_save.pack(side='right',padx=25, pady=5)
-        self.frame_texte.pack(side='top',fill='both',expand=1)
-        self.frame_boutons.pack(side='bottom')
+        self.frame_boutons.pack(side='bottom',padx=5,pady=5)
+        self.frame_texte.pack(side='top',fill='both',expand=1,padx=5,pady=5)
         self.zone_texte.focus_set()
         self.fenetre.bind('<Return>',self.quit) #dismiss window
 
@@ -134,12 +130,10 @@ class Fenetre :
         """ Affiche le texte dans la fenêtre """
         if texte != "" :
             self.zone_texte.insert(END,texte)
-            try:
-                self.fenetre.update_idletasks()
-                x0,y0,x1,y1 = self.zone_texte.bbox(END)
-                if (y1-y0) < 300 : self.efface_scroll()
-            except:
-                pass
+            self.fenetre.update_idletasks()
+            curline = int(self.zone_texte.index("insert").split('.')[0])
+            if curline < int(self.zone_texte["height"]):
+              self.efface_scroll()
 
     def save(self):
         """ Permet de sauvegarder le texte dans un fichier dont on a demandé le nom
@@ -187,7 +181,6 @@ class FenetreYesNo(Fenetre):
     def __init__(self,appli,titre="",texte="",yes="Yes",no="No"):
         self.appli=appli
         self.fenetre = Toplevel()
-        self.fenetre.configure(width = 800,height=500)
         self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
         self.fenetre.title(titre)
         self.texte = string.replace(texte,'\r\n','\n')
@@ -196,8 +189,6 @@ class FenetreYesNo(Fenetre):
         # définition des frames
         self.frame_texte = Frame(self.fenetre)
         self.frame_boutons = Frame(self.fenetre)
-        self.frame_boutons.place(relx=0,rely=0,    relwidth=1.,relheight=0.1)
-        self.frame_texte.place(  relx=0,rely=0.1,  relwidth=1, relheight=0.9)
         # définition de la zone texte et du scrollbar
         self.zone_texte = Text(self.frame_texte,font=fonte)
         self.zone_texte.bind("<Key-Prior>", self.page_up)
@@ -213,10 +204,12 @@ class FenetreYesNo(Fenetre):
         # définition des boutons
         self.but_yes = Button(self.frame_boutons,text = yes,command=self.yes)
         self.but_no = Button(self.frame_boutons,text = no,command = self.no)
-        self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
-        self.but_no.place(relx=0.6,rely=0.5,anchor='center')
+        self.but_yes.pack(side="left",padx=5,pady=5)
+        self.but_no.pack(side="left",padx=5,pady=5)
+        self.frame_boutons.pack(side="top",padx=5,pady=5)
         # affichage du texte
         self.affiche_texte(self.texte)
+        self.frame_texte.pack(side="top",fill='both',padx=5,pady=5,expand=1)
         centerwindow(self.fenetre)
 
     def yes(self):
@@ -232,15 +225,10 @@ class FenetreDeSelection(Fenetre):
         Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.
     """
     def __init__(self,panel,item,appli,titre="",texte="",cardinal=1):
-        Fenetre.__init__(self,appli,titre=titre,texte=texte)
-        self.frame_boutons.place_forget()
-        self.frame_texte.place_forget()
-        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8)
-        self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
+        Fenetre.__init__(self,appli,titre=titre,texte=texte,width=20,height=15)
 
         self.cardinal=cardinal
-        self.fenetre.configure(width = 320,height=400)
-        centerwindow(self.fenetre)
+        #self.fenetre.configure(width = 320,height=400)
         self.panel = panel
         self.item = item
         self.fenetre.title(titre)
@@ -256,16 +244,17 @@ class FenetreDeSelection(Fenetre):
                                       selectioncommand = self.choose_separateur,
                                       scrolledlist_items = l_separateurs_autorises)
         self.choix_sep.component('entry').configure(width=6)
-        self.choix_sep.place(relx=0.01,rely=0.5,anchor='w')
-        self.choix_sep.selectitem(self.separateur)
+        self.choix_sep.grid(row=0,rowspan=2,padx=5,pady=5)
+        #self.choix_sep.selectitem(self.separateur)
         # Replacement
-        self.but_quit.place_forget()
-        self.but_save.place_forget()
+        self.but_quit.pack_forget()
+        self.but_save.pack_forget()
         self.but_all  = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout)
-        self.but_save.place(relx=0.6,rely=0.6,anchor='center')
-        self.but_quit.place(relx=0.8,rely=0.6,anchor='center')
-        self.but_all.place(relx=0.7,rely=0.2,anchor='center')
+        self.but_save.grid(row=1,column=1,padx=5,pady=5)
+        self.but_quit.grid(row=1,column=2,padx=5,pady=5)
+        self.but_all.grid(row=0,column=1,columnspan=2,padx=5,pady=5)
         self.choose_separateur('espace')
+        centerwindow(self.fenetre)
      
 
     def get_separateurs_autorises(self):
@@ -451,7 +440,7 @@ class FenetreDeParametre(Fenetre) :
         self.parent=parent
         self.appli=appli
         self.fenetre = Toplevel()
-        self.fenetre.configure(width = 250,height=100)
+        #self.fenetre.configure(width = 250,height=100)
         self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
         self.fenetre.title("Parametres")
         self.titre = "Parametres"
@@ -460,9 +449,8 @@ class FenetreDeParametre(Fenetre) :
 
         # définition des frames
         self.frame_texte = Frame(self.fenetre)
-        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7)
         # définition de la zone texte et du scrollbar
-        self.zone_texte = Text(self.frame_texte,font=fonte)
+        self.zone_texte = Text(self.frame_texte,font=fonte,width=40)
         self.zone_texte.bind("<Key-Prior>", self.page_up)
         self.zone_texte.bind("<Key-Next>", self.page_down)
         self.zone_texte.bind("<Key-Up>", self.unit_up)
@@ -477,15 +465,14 @@ class FenetreDeParametre(Fenetre) :
 
         # définition des boutons
         self.frame_boutons = Frame(self.fenetre)
-        self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.)
-        self.label1 = Label(self.frame_boutons,text="surligner la")
-        self.label2 = Label(self.frame_boutons,text="ligne entière")
-        self.label1.place(relx=0.1,rely=0)
-        self.label2.place(relx=0.1,rely=0.5)
+        self.label1 = Label(self.frame_boutons,text="surligner la\nligne entière",justify=LEFT)
         self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
         self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir)
-        self.but_save.place(relx=0.6,rely=0,relheight=1)
-        self.but_quit.place(relx=0.8,rely=0,relheight=1)
+        self.but_quit.pack(side='right',padx=5, pady=5)
+        self.but_save.pack(side='right',padx=5, pady=5)
+        self.label1.pack(side='right',padx=5, pady=5)
+        self.frame_boutons.pack(side='bottom')
+        self.frame_texte.pack(side='top',expand=1,fill='both')
 
 
     def Choisir(self):
@@ -497,13 +484,23 @@ class FenetreDeParametre(Fenetre) :
         l_param = ""
         for param in selection.splitlines():
             nomparam=param[0:param.find("=")-1]
-            if nomparam != '' : 
+            if nomparam != '' :
                 l_param=l_param+nomparam+','
         self.parent.entry.delete(0,Tkinter.END)
         self.parent.entry.insert(0,l_param[0:-1])
         self.parent.valid_valeur()
         self.quit()
 
+    def affiche_texte(self,texte):
+        """ Affiche le texte dans la fenêtre """
+        if texte != "" :
+            self.zone_texte.insert(END,texte)
+            self.fenetre.update_idletasks()
+            curline = int(self.zone_texte.index("insert").split('.')[0])
+            if curline < int(self.zone_texte["height"]):
+              self.zone_texte["height"]=curline
+              self.efface_scroll()
+
 class Formulaire:
     """
     Cette classe permet de créer une boîte Dialog dans laquelle
@@ -1228,7 +1225,7 @@ class ListeChoixParGroupes(ListeChoix) :
     def affiche_liste(self):
         """ Affiche la liste dans la fenêtre"""
         liste_labels=[]
-       self.dico_mots={}
+        self.dico_mots={}
         self.MCbox.config(state=NORMAL)
         self.MCbox.delete(1.0,END)
         for grp in self.liste_groupes:
@@ -1385,3 +1382,11 @@ class ListeChoixParGroupes(ListeChoix) :
                  # On a trouve une commande  on arrete la recherche
                  return
 
+if __name__ == "__main__":
+  root=Tkinter.Tk()
+  f=FenetreDeParametre(root,None,None,"\n".join(["coucouxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=2"]*15))
+  #f=FenetreYesNo(None,titre="Le titre",texte="\n".join(["Le textexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]*35),yes="Yes",no="No")
+
+
+  root.mainloop()
+