From 74a17b32d26e757f47b625f3c79d24b5776e68bd Mon Sep 17 00:00:00 2001 From: eficas <> Date: Wed, 6 Nov 2002 17:25:57 +0000 Subject: [PATCH] =?utf8?q?CCAR:=20Modified=20Files:=20CCAR:=20=09appli.py?= =?utf8?q?=20bureau.py=20compojdc.py=20compomacro.py=20composimp.py=20CCAR?= =?utf8?q?:=20=09eficas.py=20jdcdisplay.py=20panels.py=20statusbar.py=20CC?= =?utf8?q?AR:=20=09treeitemincanvas.py=20treewidget.py=20widgets.py=20CCAR?= =?utf8?q?:=20Added=20Files:=20CCAR:=20=09patches.py=20CCAR:=20-----------?= =?utf8?q?-----------------------------------------------------------=20CC?= =?utf8?q?AR=20:=20developpement=20pour=20traiter=20correctement=20l'inser?= =?utf8?q?tion=20et=20la=20destruction=20des=20macros=20avec=20etapes=20et?= =?utf8?q?=20concepts=20inclus.=20Ces=20INCLUDEs=20sont=20evalu=C3=A9s=20d?= =?utf8?q?ans=20un=20JDC=20auxiliaire=20avant=20d'etre=20ins=C3=A9r=C3=A9e?= =?utf8?q?s=20d=C3=A9finitivement=20dans=20la=20macro=20apres=20verificati?= =?utf8?q?on.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Editeur/appli.py | 13 +++- Editeur/bureau.py | 14 +++- Editeur/compomacro.py | 136 ++++++++++++++++++++++++------------ Editeur/composimp.py | 11 ++- Editeur/eficas.py | 10 ++- Editeur/jdcdisplay.py | 6 ++ Editeur/panels.py | 3 + Editeur/patches.py | 67 ++++++++++++++++++ Editeur/treeitemincanvas.py | 3 + Editeur/treewidget.py | 47 ++++--------- Editeur/widgets.py | 59 ++++++++++++++-- 11 files changed, 277 insertions(+), 92 deletions(-) create mode 100644 Editeur/patches.py 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 -- 2.39.2