From: eficas <> Date: Wed, 6 Nov 2002 17:25:57 +0000 (+0000) Subject: CCAR: Modified Files: X-Git-Tag: CC_param_poursuite~377 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=74a17b32d26e757f47b625f3c79d24b5776e68bd;p=modules%2Feficas.git CCAR: Modified Files: CCAR: appli.py bureau.py compojdc.py compomacro.py composimp.py CCAR: eficas.py jdcdisplay.py panels.py statusbar.py CCAR: treeitemincanvas.py treewidget.py widgets.py CCAR: Added Files: CCAR: patches.py CCAR: ---------------------------------------------------------------------- CCAR : developpement pour traiter correctement l'insertion et la destruction des macros avec etapes et concepts inclus. Ces INCLUDEs sont evalués dans un JDC auxiliaire avant d'etre insérées définitivement dans la macro apres verification. --- diff --git a/Editeur/appli.py b/Editeur/appli.py index 8dd925b7..83b32439 100644 --- a/Editeur/appli.py +++ b/Editeur/appli.py @@ -28,6 +28,7 @@ import sys import types import Pmw import Tkinter +from tkMessageBox import showinfo,askyesno,showerror # Modules Eficas import splash @@ -35,6 +36,7 @@ import prefs import fontes import tooltip import properties +from widgets import Fenetre VERSION="EFICAS v1.3" @@ -78,7 +80,7 @@ class APPLI: """ Cree les constituants de l'application : - menubar - - tollbar + - toolbar - bureau - statusbar """ @@ -217,3 +219,12 @@ class APPLI: menu=menudict.get(mname) if not menu:continue self.cree_menu(menu,itemlist,appli_composant) + + def update_jdc_courant(self): + self.bureau.update_jdc_courant() + + def affiche_alerte(self,titre,message): + f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message) + f.wait() + + diff --git a/Editeur/bureau.py b/Editeur/bureau.py index 56bfa7dd..ecce22bc 100644 --- a/Editeur/bureau.py +++ b/Editeur/bureau.py @@ -139,7 +139,9 @@ class BUREAU: CONTEXT.unset_current_step() J=self.cata[0].JdC(cata=self.cata, cata_ord_dico=self.cata_ordonne_dico, - appli=self.appli) + appli=self.appli, + rep_mat=self.appli.CONFIGURATION.rep_mat, + ) self.JDCName=J.nom self.fileName=None self.ShowJDC(J,self.JDCName) @@ -209,6 +211,7 @@ class BUREAU: if not hasattr(self,'JDC') : return titre="rapport de validation du jeu de commandes courant" cr = self.JDC.report() + self.update_jdc_courant() elif mode == 'CATA': from Noyau.N_CR import CR cr = CR() @@ -277,7 +280,9 @@ class BUREAU: CONTEXT.unset_current_step() J=self.cata[0].JdC(procedure=text,appli=self.appli, cata=self.cata,cata_ord_dico=self.cata_ordonne_dico, - nom = self.JDCName) + nom = self.JDCName, + rep_mat=self.appli.CONFIGURATION.rep_mat, + ) J.analyse() txt_exception = J.cr.get_mess_exception() if txt_exception : @@ -582,3 +587,8 @@ class BUREAU: def aideEFICAS(self): AIDE.go(master=self.parent) + + def update_jdc_courant(self): + self.JDCDisplay_courant.update() + + diff --git a/Editeur/compomacro.py b/Editeur/compomacro.py index edbf840c..6d8e0f45 100644 --- a/Editeur/compomacro.py +++ b/Editeur/compomacro.py @@ -23,7 +23,7 @@ import types import Tkinter import Pmw from tkFileDialog import * -from tkMessageBox import showinfo,showerror +from tkMessageBox import showinfo,showerror,askyesno import traceback # Modules Eficas @@ -32,11 +32,11 @@ import panels import fontes import compooper import convert -from widgets import Fenetre +from widgets import Fenetre,FenetreYesNo # __version__="$Name: $" -__Id__="$Id: compomacro.py,v 1.4 2002/05/15 15:31:58 eficas Exp $" +__Id__="$Id: compomacro.py,v 1.5 2002/09/09 10:39:06 eficas Exp $" # class MACROPanel(panels.OngletPanel): @@ -95,9 +95,9 @@ class MACROPanel(panels.OngletPanel): Tkinter.Button(page,text='Valider',command = self.change_fichier_init).place(relx=0.3,rely=0.8) Tkinter.Button(page,text='Browse',command = self.browse_fichier_init).place(relx=0.5,rely=0.8) Tkinter.Button(page,text='Annuler',command = self.annule_fichier_init).place(relx=0.7,rely=0.8) - if hasattr(self.node.item.object,'fichier_init'): - if self.node.item.object.fichier_init : - self.entry.insert(0,self.node.item.object.fichier_init) + if hasattr(self.node.item.object,'fichier_ini'): + if self.node.item.object.fichier_ini : + self.entry.insert(0,self.node.item.object.fichier_ini) self.entry.focus() def convert_file(self,file): @@ -127,9 +127,17 @@ class MACROPanel(panels.OngletPanel): """ Effectue le changement de fichier d'initialisation s'il est valide """ - if not hasattr(self.node.item.object,'fichier_init'): - self.node.item.object.fichier_init=None - old_fic = self.node.item.object.fichier_init + if not hasattr(self.node.item.object,'fichier_ini'): + self.node.item.object.fichier_ini=None + self.node.item.object.fichier_text=None + self.node.item.object.fichier_err="Le fichier n'est pas defini" + self.node.item.object.contexte_fichier_init={} + + old_fic = self.node.item.object.fichier_ini + old_text = self.node.item.object.fichier_text + old_err = self.node.item.object.fichier_err + old_context=self.node.item.object.contexte_fichier_init + new_fic = self.entry.get() if not os.path.isfile(new_fic) : showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+ @@ -138,50 +146,80 @@ class MACROPanel(panels.OngletPanel): return # On convertit le fichier text=self.convert_file(new_fic) - if not text:return + # Si probleme a la lecture-conversion on arrete le traitement + if not text: + return + try: - self.node.item.object.make_contexte(new_fic,text) - self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom()) + self.node.item.object.make_contexte_include(new_fic,text) except: - #traceback.print_exc() + # Erreurs lors de l'evaluation de text dans un JDC auxiliaire + self.parent.appli.affiche_infos("Fichier invalide") l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1]) - showinfo("Fichier invalide", - "Erreur dans l'interprétation du nouveau fichier ...\n"+ - "L'ancien va être restauré\n"+string.join(l)) + f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?", + texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l)) + f.wait() + reponse=f.result + if reponse: + # On retablit l'ancien fichier + self.entry.delete(0,Tkinter.END) + self.node.item.object.fichier_ini=old_fic + self.node.item.object.fichier_text=old_text + self.node.item.object.fichier_err=old_err + self.node.item.object.contexte_fichier_init=old_context + self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré") + if old_fic: + self.entry.insert(0,self.node.item.object.fichier_ini) + else: + # On conserve la memoire du nouveau fichier + # mais on n'utilise pas les etapes et concepts crees par ce fichier + # on met l'etape en erreur : fichier_err=string.join(l) + self.node.item.object.init_modif() + self.node.item.object.fichier_ini=new_fic + self.node.item.object.fichier_text=text + self.node.item.object.fichier_err=string.join(l) + self.node.item.object.etapes=[] + self.node.item.object.g_context={} + # Le contexte du parent doit etre reinitialise car les concepts produits ont changé + self.node.item.object.parent.reset_context() - self.entry.delete(0,Tkinter.END) - self.parent.appli.affiche_infos("Fichier invalide") + self.node.item.object.old_contexte_fichier_init=old_context + self.node.item.object.contexte_fichier_init={} + self.node.item.object.reevalue_sd_jdc() - if old_fic: - # On convertit le fichier - #text=self.convert_file(old_fic) - #if not text:return - #self.node.item.object.make_contexte(old_fic,text) - self.node.item.object.fichier_init=old_fic - self.entry.insert(0,self.node.item.object.fichier_init) - self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré") + self.node.item.object.fin_modif() + self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé") + self.node.update() return - # si on passe ici, c'est que le new_fic a bien été correctement - # interprété ... - self.node.item.object.fichier_init = new_fic - # il faut lancer la réévaluation de tout le jdc ... + + # L'evaluation de text dans un JDC auxiliaire s'est bien passé + # on peut poursuivre le traitement + self.node.item.object.init_modif() + self.node.item.object.fichier_ini = new_fic + self.node.item.object.fichier_text=text + self.node.item.object.fichier_err=None + # Le contexte du parent doit etre reinitialise car les concepts produits ont changé + self.node.item.object.parent.reset_context() + + # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression + self.node.item.object.old_contexte_fichier_init=old_context self.node.item.object.reevalue_sd_jdc() - self.node.racine.update() + + self.node.item.object.fin_modif() + self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom()) + self.node.update() def annule_fichier_init(self,event=None): - """ retaure dans self.entry le nom de fichier_init""" + """ Restaure dans self.entry le nom de fichier_init""" self.entry.delete(0,Tkinter.END) - self.entry.insert(0,self.node.item.object.fichier_init) + self.entry.insert(0,self.node.item.object.fichier_ini) def browse_fichier_init(self,event=None): """ Propose à l'utilisateur une Bsf et retourne le fichier sélectionné dans self.entry """ - file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom(), - # filetypes = ( ("Aster", ".comm"),("Python", ".py")), - # defaultextension=".comm" - ) + file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom()) if file != '' : self.entry.delete(0,Tkinter.END) self.entry.insert(0,file) @@ -198,18 +236,13 @@ class MACROTreeItem(compooper.EtapeTreeItem): Retourne le nom de l'icône à afficher dans l'arbre Ce nom dépend de la validité de l'objet """ - if self.object.isactif(): - if self.object.state != 'unchanged': - # Si des modifications ont eu lieu on force le calcul des concepts de sortie - # et celui du contexte glissant - self.object.get_type_produit(force=1) - self.object.parent.reset_context() + if not self.object.isactif(): + return "ast-white-square" + else: if self.object.isvalid(): return "ast-green-square" else: return "ast-red-square" - else: - return "ast-white-square" def GetLabelText(self): """ Retourne 3 valeurs : @@ -295,8 +328,19 @@ class MACROTreeItem(compooper.EtapeTreeItem): def get_noms_sd_oper_reentrant(self): return self.object.get_noms_sd_oper_reentrant() -import Accas +class INCLUDE_MATERIAUTreeItem(MACROTreeItem): + pass + treeitem=MACROTreeItem +def treeitem(appli, labeltext, object, setfunction=None): + if object.nom == "INCLUDE_MATERIAU": + return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction) + elif object.nom == "INCLUDE": + return MACROTreeItem(appli, labeltext, object, setfunction) + else: + return MACROTreeItem(appli, labeltext, object, setfunction) + +import Accas objet=Accas.MACRO_ETAPE class MacroDisplay: diff --git a/Editeur/composimp.py b/Editeur/composimp.py index 5bb8eba3..a692a9da 100644 --- a/Editeur/composimp.py +++ b/Editeur/composimp.py @@ -60,7 +60,7 @@ class newSIMPPanel(panels.OngletPanel): nb.setnaturalsize() # ---------------------------------------------------------------------------------------- -# Méthodes utlisées pour l'affectation de la valeur donnée par l'utilisateur +# Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur # au mot-clé courant # ---------------------------------------------------------------------------------------- @@ -73,8 +73,14 @@ class newSIMPPanel(panels.OngletPanel): if name != None: valeur =name else : + #XXX Pourquoi proceder ainsi ? Il n'est pas possible de mettre + # None comme valeur du mot cle. + # Probablement que ce debranchement permet de mettre record_valeur + # en call back, il faut donc aller chercher la valeur dans l'entry valeur= self.entry.get() self.entry.delete(0,END) + #XXX Pour permettre la mise a None du mot cle, on remet None si valeur == '' + if valeur == '':valeur=None self.node.item.set_valeur(valeur,evaluation='non') self.parent.appli.affiche_infos(mess) if self.node.item.get_position()=='global': @@ -86,8 +92,9 @@ class newSIMPPanel(panels.OngletPanel): self.node.update() if self.node.item.isvalid(): self.node.parent.select() + # ---------------------------------------------------------------------------------------- -# Méthodes utlisées pour la manipulation des items dans les listes de choix +# Méthodes utilisées pour la manipulation des items dans les listes de choix # ---------------------------------------------------------------------------------------- def selectValeur(self,name): self.selected_valeur = name diff --git a/Editeur/eficas.py b/Editeur/eficas.py index 14419aae..f9e97f9b 100644 --- a/Editeur/eficas.py +++ b/Editeur/eficas.py @@ -31,6 +31,7 @@ from tkMessageBox import askyesno,showerror import traceback # Modules Eficas +import patches import appli from widgets import Fenetre @@ -68,7 +69,7 @@ class EFICAS(appli.APPLI): self._ulfile.setentry('') self.dialog.deactivate(result) self.ulfile = None - self.text='' + self.text=None def get_file(self,unite=None,fic_origine = ''): """ @@ -129,3 +130,10 @@ class EFICAS(appli.APPLI): showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier") return None + def affiche_texte(self,entete,texte): + """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte + """ + self.affiche_infos(entete) + f=Fenetre(self, titre=entete, texte = texte) + f.wait() + diff --git a/Editeur/jdcdisplay.py b/Editeur/jdcdisplay.py index 05f591ec..820d7bac 100644 --- a/Editeur/jdcdisplay.py +++ b/Editeur/jdcdisplay.py @@ -265,3 +265,9 @@ class JDCDISPLAY: # on rend la copie à nouveau possible en libérant le flag edit self.edit="copier" + def update(self): + """Cette methode est utilisee par le JDC associe pour + signaler des modifications globales du JDC + """ + self.tree.update() + diff --git a/Editeur/panels.py b/Editeur/panels.py index 328015d9..3c5c5e45 100644 --- a/Editeur/panels.py +++ b/Editeur/panels.py @@ -37,6 +37,9 @@ class Panel(Frame) : Elle est toujours dérivée. """ def __init__(self,parent,panneau,node) : + # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee + # ou un objet qui a les attributs : appli (de classe APPLI ou derivee), + # modified et la methode init_modif self.parent=parent self.panneau = panneau self.node=node diff --git a/Editeur/patches.py b/Editeur/patches.py new file mode 100644 index 00000000..b85f654c --- /dev/null +++ b/Editeur/patches.py @@ -0,0 +1,67 @@ +""" + Ce module contient des modifications mineures du comportement + du noyau ou de validation +""" +import string + +if 1: + # Modification de la fonction justify_text de Noyau.N_CR + separateurs=(' ',',','/') + def split(ligne,cesure): + ligne= string.rstrip(ligne) + if len(ligne) <= cesure : + return ligne + else: + coupure=cesure + while ligne[coupure] not in separateurs and coupure > 0: + coupure = coupure - 1 + if coupure == 0: + # Il faut augmenter la cesure + coupure =cesure + while ligne[coupure] not in separateurs and coupure < len(ligne)-1 : + coupure = coupure + 1 + if coupure == len(ligne)-1: + return ligne + else: + return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure) + + def justify_text(texte='',cesure=50): + texte = string.strip(texte) + liste_lignes = string.split(texte,'\n') + l=[split(l,cesure) for l in liste_lignes] + texte_justifie=string.join(l,'\n') + return texte_justifie + try: + import Noyau.N_CR + Noyau.N_CR.justify_text=justify_text + except: + pass + +def encadre_message(texte,motif): + """ + Retourne la chaine de caractères texte entourée d'un cadre formés + d'éléments 'motif' + """ + texte = justify_text(texte,cesure=80) + lignes = string.split(texte,'\n') + longueur = 0 + for ligne in lignes : + if len(ligne)> longueur : longueur = len(ligne) + longueur = longueur + 4 + txt = motif*longueur+'\n' + for ligne in lignes : + txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n' + txt = txt + motif*longueur+'\n' + return txt + +if __name__ == "__main__": + print encadre_message(motif='!', +texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE') +- Il faut au moins un mot-clé parmi : ('FIN',) +- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',) +ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy +""") + + + diff --git a/Editeur/treeitemincanvas.py b/Editeur/treeitemincanvas.py index 2a1c45ac..a9d5c86e 100644 --- a/Editeur/treeitemincanvas.py +++ b/Editeur/treeitemincanvas.py @@ -55,3 +55,6 @@ class TREEITEMINCANVAS: def mainloop(self): self.parent.mainloop() + def update(self): + """Cette methode est utilisee pour signaler une mise a jour des objets associes""" + self.tree.update() diff --git a/Editeur/treewidget.py b/Editeur/treewidget.py index 58a954dc..ebf3cd51 100644 --- a/Editeur/treewidget.py +++ b/Editeur/treewidget.py @@ -26,7 +26,7 @@ import images # __version__="$Name: $" -__Id__="$Id: treewidget.py,v 1.7 2002/09/10 15:59:37 eficas Exp $" +__Id__="$Id: treewidget.py,v 1.8 2002/10/16 13:27:35 eficas Exp $" # Fonte_Standard = fontes.standard @@ -71,8 +71,6 @@ class Tree : for child in self.children: child.draw(x,lasty) lasty = child.lasty + 15 - child.trace_ligne() - #self.update() self.children[0].select() self.resizescrollregion() @@ -289,6 +287,7 @@ class Node : child.draw(x,y) nb = child.get_nb_children() y = y + 20*(nb+1) + self.trace_ligne() def drawtext(self): """ Affiche les deux zones de texte après l'icône de couleur de l'objet """ @@ -363,26 +362,17 @@ class Node : nb = self.get_nb_children() self.state = 'collapsed' self.collapse_children() - self.efface() - try: - self.move(-20*nb) - except: - pass - self.draw(self.x,self.y) + self.redraw(-nb) self.select() - self.update() - + def expand(self,event = None): """ Expanse self et le retrace """ if not self.item.isactif() : return if not self.children : self.build_children() self.state = 'expanded' nb = self.get_nb_children() - self.move(20*nb) - self.efface() - self.draw(self.x,self.y) + self.redraw(nb) self.select() - self.update() def redraw(self,nb): """ Redessine self : nb est le décalage à introduire @@ -392,7 +382,10 @@ class Node : # on efface self et on le redessine self.efface() self.draw(self.x,self.y) - self.update() + # Il n'est pas nécessaire d'appeler update + # il suffit d'updater les coordonnees et de retracer les lignes + self.racine.update_coords() + self.racine.trace_ligne() def update_coords(self): """ Permet d'updater les coordonnes de self et de tous ses enfants""" @@ -495,19 +488,6 @@ class Node : print child print child.item.object - def make_visible_OBSOLETE(self,nb): - """ Cette méthode a pour but de rendre le noeud self (avec tous ses descendants - affichés) visible dans le canvas """ - x = self.canvas.canvasx(self.canvas.cget('width')) - y = self.canvas.canvasy(self.canvas.cget('height')) - #print 'x,y =',x,y - x0,y0,x1,y1 = self.canvas.bbox(ALL) - #print 'x0,y1=',x0,y1 - y_deb = self.y - nb = self.get_nb_children() - y_fin = y_deb + 20*nb - #print 'y_deb,y_fin=',y_deb,y_fin - #------------------------------------------------------------------ # Méthodes de création et destruction de noeuds # Certaines de ces méthodes peuvent être appelées depuis l'externe @@ -577,7 +557,6 @@ class Node : """ if not self.children : self.build_children() if pos == None : - #pos = len(self.children) if type(fils) == types.InstanceType: pos = self.item.get_index_child(fils.nom) else: @@ -586,10 +565,12 @@ class Node : if child == 0 : # on n'a pas pu créer le noeud fils return 0 - child.displayed = 1 self.state = 'expanded' + child.displayed = 1 + if child.item.isactif(): + child.state = 'expanded' + if not child.children : child.build_children() if verif == 'oui': - if not child.children : child.build_children() test = child.item.isMCList() if test : child.children[-1].verif_condition() @@ -629,8 +610,6 @@ class Node : nbnew = self.get_nb_children() self.redraw(nbnew-nbold) child.select() - child.expand() - #child.make_visible() if retour == 'oui': return child def delete_node_child(self,child): diff --git a/Editeur/widgets.py b/Editeur/widgets.py index 2eefd4b2..723e6fcf 100644 --- a/Editeur/widgets.py +++ b/Editeur/widgets.py @@ -85,6 +85,7 @@ class Fenetre : def wait(self): self.fenetre.grab_set() + self.zone_texte.focus_set() self.fenetre.wait_window(self.fenetre) def quit(self): @@ -121,6 +122,50 @@ class Fenetre : else: showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file) +class FenetreYesNo(Fenetre): + def __init__(self,appli,titre="",texte=""): + 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') + self.titre = titre + fonte=fontes.standardcourier10 + # 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("", self.page_up) + self.zone_texte.bind("", self.page_down) + self.zone_texte.bind("", self.unit_up) + self.zone_texte.bind("", self.unit_down) + self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview) + #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview) + self.scroll_v.pack(side='right',fill ='y') + #self.scroll_h.pack(side='bottom',fill ='x') + self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10) + self.zone_texte.configure(yscrollcommand=self.scroll_v.set) + # 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') + # affichage du texte + self.affiche_texte(self.texte) + centerwindow(self.fenetre) + + def yes(self): + self.result=1 + self.quit() + + def no(self): + self.result=0 + self.quit() + class FenetreDeSelection(Fenetre): """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée. Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé. @@ -555,7 +600,7 @@ class ListeChoix : def affiche_liste(self): """ Affiche la liste dans la fenêtre""" - i=0 + liste_labels=[] self.MCbox.config(state=NORMAL) self.MCbox.delete(1.0,END) for objet in self.liste : @@ -575,6 +620,7 @@ class ListeChoix : text = mot, fg = 'black',bg = 'gray95',justify = 'left') self.dico_labels[mot]=label + liste_labels.append(label) self.MCbox.window_create(END, window=label, stretch = 1) @@ -583,12 +629,13 @@ class ListeChoix : label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,l=label : s.selectitem(x,l,c)) label.bind(self.liste_commandes[1][0],lambda e,s=self,c=self.liste_commandes[1][1],x=objet,l=label : s.deselectitem(l,x,c)) label.bind(self.liste_commandes[2][0],lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitem(x,l,c)) - try : - self.liste_marques.index(i) - self.markitem(label) - except: + + for marque in self.liste_marques: + try: + self.markitem(liste_labels[marque]) + except: pass - i=i+1 + self.MCbox.config(state=DISABLED) self.selection = None