From e2de84a8af4248fbaa60779dcd59c633474354a0 Mon Sep 17 00:00:00 2001 From: eficas <> Date: Mon, 18 Aug 2003 15:28:57 +0000 Subject: [PATCH] PN : changement de commentaires et de fin de ligne (suppression des ^M) --- Editeur/widgets.py | 618 +++++++++++++++++++++++---------------------- 1 file changed, 311 insertions(+), 307 deletions(-) diff --git a/Editeur/widgets.py b/Editeur/widgets.py index 50dc7a0b..1d648f27 100644 --- a/Editeur/widgets.py +++ b/Editeur/widgets.py @@ -167,193 +167,193 @@ class FenetreYesNo(Fenetre): 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é. - """ - def __init__(self,panel,item,appli,titre="",texte=""): - Fenetre.__init__(self,appli,titre=titre,texte=texte) - self.fenetre.configure(width = 320,height=400) + """ 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é. + """ + def __init__(self,panel,item,appli,titre="",texte=""): + Fenetre.__init__(self,appli,titre=titre,texte=texte) + self.fenetre.configure(width = 320,height=400) centerwindow(self.fenetre) self.panel = panel self.item = item self.fenetre.title(titre) - self.but_save.configure(text="Ajouter",command=self.traite_selection) - # séparateur par défaut - self.separateur = ";" - # création de la zone de saisie du séparateur - l_separateurs_autorises = self.get_separateurs_autorises() - self.choix_sep = Pmw.ComboBox(self.frame_boutons, - label_text = "Séparateur :", - labelpos = 'w', - listheight = 100, - 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) - # Replacement - self.but_quit.place_forget() - self.but_save.place_forget() - self.but_save.place(relx=0.6,rely=0.5,anchor='center') - self.but_quit.place(relx=0.8,rely=0.5,anchor='center') - - def get_separateurs_autorises(self): - """ - Retourne la liste des séparateurs autorisés - """ - return ['espace',';',','] - - def choose_separateur(self,nom_sep): - """ - Affecte à self.separateur le caractère séparateur correspondant à nom_sep - """ - if nom_sep == 'espace' : - self.separateur = ' ' - else: - self.separateur = nom_sep - - def traite_selection(self): - """ Cette méthode effectue tous les traitements nécessaires pour vérifier - et affecter la liste de valeurs à l'objet réprésenté par self.item - """ - # Récupère la liste des chaines de caractères de la zone sélectionnée - message,liste = self.recupere_liste() - if self.test_probleme(message,"Sélectionnez des données") == 0: - return - # Vérifie que le nombre de données est dans les limites attendues - message = self.verif_liste(liste) - if self.test_probleme(message,"Vérifiez le nombre de données") == 0: - return - # Crée une liste de valeurs du type attendu - message,liste_valeurs = self.creation_liste_valeurs(liste) - if self.test_probleme(message,"Vérifiez le type des données") == 0: - return - # Vérifie que chaque valeur est dans le domaine exigé - message = self.verif_valeurs(liste_valeurs) - if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0: - return - # Ajoute les valeurs dans la liste de valeurs du mot-clé - self.ajouter_valeurs(liste_valeurs) - self.appli.affiche_infos("Liste de valeurs acceptée") - - def test_probleme(self, message, message_eficas): - """ Cette méthode affiche un message d'erreur si message != '' - et retourne 0, sinon retourne 1 sans rien afficher. - """ - if message != "": - showinfo("Problème",message) - self.fenetre.tkraise() - self.appli.affiche_infos(message_eficas) - return 0 - else: - return 1 - - def recupere_liste(self): - """ Cette méthode récupère le texte de la zone sélectionnée, construit et - retourne une liste avec les chaines qui se trouvent entre les séparateurs. - S'il n'y a pas de données selectionnées, elle retourne un message d'erreur - et une liste vide. - """ - message = "" - try: - selection=self.fenetre.selection_get() - except: - message = "Pas de donnée sélectionnée" - return message,None - # les retours chariots doivent être interprétés comme des séparateurs - selection = string.replace(selection,'\n',self.separateur) - # on splitte la sélection suivant le caractère séparateur - liste_chaines = string.split(selection,self.separateur) - l_chaines = [] - for chaine in liste_chaines: - chaine = string.strip(chaine) - if chaine != '' : l_chaines.append(chaine) - return message,l_chaines - - def verif_liste(self, liste): - """ Cette méthode effectue des tests sur le nombre d'éléments de la liste - et retourne 1 si la liste est correcte, sinon 0 et le message d'erreur - correspondant. - """ - message = "" - # nombre d'éléments sélectionnés - nombre_elements = len(liste) - # nombre d'éléments déja dans la liste du panel - nombre_in_liste = len(self.panel.Liste_valeurs.get_liste()) - multiplicite = self.item.GetMultiplicite() - if (nombre_elements % multiplicite) != 0: - message = "Vous devez sélectionner "+str(multiplicite)+" * n données" - return message - nombre_valeurs = nombre_elements / multiplicite - cardinalite = self.item.GetMinMax() - if nombre_valeurs < cardinalite[0]: - message = "Vous devez sélectionner au moins "+str(cardinalite[0])+" valeurs" - return message - if cardinalite[1] != "**" and nombre_valeurs > (long(cardinalite[1])-nombre_in_liste): - message = "La liste ne peut avoir plus de "+str(cardinalite[1])+" valeurs" - return message - - return message - - def creation_liste_valeurs(self, liste): - """ Cette méthode crée et retourne une liste de valeurs du type attendu - par le mot-clé. La liste de valeurs est créée à partir de la liste - de chaines de caractères transmise. - """ - type_attendu = self.item.GetType()[0] - if type_attendu == 'R': - return self.convertir(liste, f_conversion= float) - elif type_attendu == 'I': - return self.convertir(liste, f_conversion= int) - elif type_attendu == 'TXM': - return self.convertir(liste) - else: - message = "Seuls les entiers, les réels et les chaines de caractères sont convertis" - return message,None - - def convertir(self, liste, f_conversion=None): - """ Cette méthode essaie de convertir les éléments de la liste avec la - fonction f_conversion si elle existe, et retourne la liste des - éléments dans le type voulu en cas de succès, sinon retourne None. - """ - liste_valeurs = [] - message = "" - for chaine in liste: - if f_conversion: - try: - liste_valeurs.append(f_conversion(chaine)) - except: - message = "Impossible de convertir "+chaine+" dans le type attendu" - return message,None - else: - liste_valeurs.append(chaine) - return message,liste_valeurs - - def verif_valeurs(self, liste_valeurs): - """ Cette méthode teste tous les éléments de la liste, et retourne 1 si chaque - élément est dans le domaine voulu. - """ - message = "" - for valeur in liste_valeurs: - test = self.item.IsInIntervalle(valeur) - if test == 0: - intervalle = str(self.item.GetIntervalle()[0])+","+str(self.item.GetIntervalle()[1]) - message = "La valeur "+str(valeur)+" n'est pas dans l'intervalle ["+intervalle+"]" - return message - return message - - def ajouter_valeurs(self, liste_valeurs): - """ Cette méthode ajoute les nouvelles valeurs à la liste existante.""" - liste = self.panel.Liste_valeurs.get_liste() - liste.extend(liste_valeurs) + self.but_save.configure(text="Ajouter",command=self.traite_selection) + # séparateur par défaut + self.separateur = ";" + # création de la zone de saisie du séparateur + l_separateurs_autorises = self.get_separateurs_autorises() + self.choix_sep = Pmw.ComboBox(self.frame_boutons, + label_text = "Séparateur :", + labelpos = 'w', + listheight = 100, + 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) + # Replacement + self.but_quit.place_forget() + self.but_save.place_forget() + self.but_save.place(relx=0.6,rely=0.5,anchor='center') + self.but_quit.place(relx=0.8,rely=0.5,anchor='center') + + def get_separateurs_autorises(self): + """ + Retourne la liste des séparateurs autorisés + """ + return ['espace',';',','] + + def choose_separateur(self,nom_sep): + """ + Affecte à self.separateur le caractère séparateur correspondant à nom_sep + """ + if nom_sep == 'espace' : + self.separateur = ' ' + else: + self.separateur = nom_sep + + def traite_selection(self): + """ Cette méthode effectue tous les traitements nécessaires pour vérifier + et affecter la liste de valeurs à l'objet réprésenté par self.item + """ + # Récupère la liste des chaines de caractères de la zone sélectionnée + message,liste = self.recupere_liste() + if self.test_probleme(message,"Sélectionnez des données") == 0: + return + # Vérifie que le nombre de données est dans les limites attendues + message = self.verif_liste(liste) + if self.test_probleme(message,"Vérifiez le nombre de données") == 0: + return + # Crée une liste de valeurs du type attendu + message,liste_valeurs = self.creation_liste_valeurs(liste) + if self.test_probleme(message,"Vérifiez le type des données") == 0: + return + # Vérifie que chaque valeur est dans le domaine exigé + message = self.verif_valeurs(liste_valeurs) + if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0: + return + # Ajoute les valeurs dans la liste de valeurs du mot-clé + self.ajouter_valeurs(liste_valeurs) + self.appli.affiche_infos("Liste de valeurs acceptée") + + def test_probleme(self, message, message_eficas): + """ Cette méthode affiche un message d'erreur si message != '' + et retourne 0, sinon retourne 1 sans rien afficher. + """ + if message != "": + showinfo("Problème",message) + self.fenetre.tkraise() + self.appli.affiche_infos(message_eficas) + return 0 + else: + return 1 + + def recupere_liste(self): + """ Cette méthode récupère le texte de la zone sélectionnée, construit et + retourne une liste avec les chaines qui se trouvent entre les séparateurs. + S'il n'y a pas de données selectionnées, elle retourne un message d'erreur + et une liste vide. + """ + message = "" + try: + selection=self.fenetre.selection_get() + except: + message = "Pas de donnée sélectionnée" + return message,None + # les retours chariots doivent être interprétés comme des séparateurs + selection = string.replace(selection,'\n',self.separateur) + # on splitte la sélection suivant le caractère séparateur + liste_chaines = string.split(selection,self.separateur) + l_chaines = [] + for chaine in liste_chaines: + chaine = string.strip(chaine) + if chaine != '' : l_chaines.append(chaine) + return message,l_chaines + + def verif_liste(self, liste): + """ Cette méthode effectue des tests sur le nombre d'éléments de la liste + et retourne 1 si la liste est correcte, sinon 0 et le message d'erreur + correspondant. + """ + message = "" + # nombre d'éléments sélectionnés + nombre_elements = len(liste) + # nombre d'éléments déja dans la liste du panel + nombre_in_liste = len(self.panel.Liste_valeurs.get_liste()) + multiplicite = self.item.GetMultiplicite() + if (nombre_elements % multiplicite) != 0: + message = "Vous devez sélectionner "+str(multiplicite)+" * n données" + return message + nombre_valeurs = nombre_elements / multiplicite + cardinalite = self.item.GetMinMax() + if nombre_valeurs < cardinalite[0]: + message = "Vous devez sélectionner au moins "+str(cardinalite[0])+" valeurs" + return message + if cardinalite[1] != "**" and nombre_valeurs > (long(cardinalite[1])-nombre_in_liste): + message = "La liste ne peut avoir plus de "+str(cardinalite[1])+" valeurs" + return message + + return message + + def creation_liste_valeurs(self, liste): + """ Cette méthode crée et retourne une liste de valeurs du type attendu + par le mot-clé. La liste de valeurs est créée à partir de la liste + de chaines de caractères transmise. + """ + type_attendu = self.item.GetType()[0] + if type_attendu == 'R': + return self.convertir(liste, f_conversion= float) + elif type_attendu == 'I': + return self.convertir(liste, f_conversion= int) + elif type_attendu == 'TXM': + return self.convertir(liste) + else: + message = "Seuls les entiers, les réels et les chaines de caractères sont convertis" + return message,None + + def convertir(self, liste, f_conversion=None): + """ Cette méthode essaie de convertir les éléments de la liste avec la + fonction f_conversion si elle existe, et retourne la liste des + éléments dans le type voulu en cas de succès, sinon retourne None. + """ + liste_valeurs = [] + message = "" + for chaine in liste: + if f_conversion: + try: + liste_valeurs.append(f_conversion(chaine)) + except: + message = "Impossible de convertir "+chaine+" dans le type attendu" + return message,None + else: + liste_valeurs.append(chaine) + return message,liste_valeurs + + def verif_valeurs(self, liste_valeurs): + """ Cette méthode teste tous les éléments de la liste, et retourne 1 si chaque + élément est dans le domaine voulu. + """ + message = "" + for valeur in liste_valeurs: + test = self.item.IsInIntervalle(valeur) + if test == 0: + intervalle = str(self.item.GetIntervalle()[0])+","+str(self.item.GetIntervalle()[1]) + message = "La valeur "+str(valeur)+" n'est pas dans l'intervalle ["+intervalle+"]" + return message + return message + + def ajouter_valeurs(self, liste_valeurs): + """ Cette méthode ajoute les nouvelles valeurs à la liste existante.""" + liste = self.panel.Liste_valeurs.get_liste() + liste.extend(liste_valeurs) self.panel.Liste_valeurs.put_liste(liste) class Formulaire: - """ + """ Cette classe permet de créer une boîte Dialog dans laquelle - on affiche un formulaire à remplir par l'utilisateur + on affiche un formulaire à remplir par l'utilisateur """ - def __init__(self,fen_pere,obj_pere=None,titre="",texte="",items=(),mode='query',commande=None): + def __init__(self,fen_pere,obj_pere=None,titre="",texte="",items=(),mode='query',commande=None): if items in ((),[]) : return self.items = items self.titre = titre @@ -364,25 +364,25 @@ class Formulaire: self.command = commande self.display() - def display(self): + def display(self): self.init_validateurs() self.init_fenetre() self.init_texte() self.init_items_formulaire() self.fenetre.activate(geometry='centerscreenalways') - - def init_validateurs(self): - """ - Crée le dictionnaire des validateurs des objets reconnus par le formulaire - """ - self.d_validateurs = {} - self.d_validateurs['rep'] = self.repvalidator - self.d_validateurs['file'] = self.filevalidator - self.d_validateurs['cata']= self.catavalidator + + def init_validateurs(self): + """ + Crée le dictionnaire des validateurs des objets reconnus par le formulaire + """ + self.d_validateurs = {} + self.d_validateurs['rep'] = self.repvalidator + self.d_validateurs['file'] = self.filevalidator + self.d_validateurs['cata']= self.catavalidator - def init_fenetre(self): - """ - Crée la fenêtre Dialog + def init_fenetre(self): + """ + Crée la fenêtre Dialog """ if self.mode == 'query': buttons=('Valider','Annuler') @@ -398,118 +398,118 @@ class Formulaire: buttons=buttons, defaultbutton = defaultbutton, title = self.titre, - command = self.execute) + command = self.execute) self.fenetre.withdraw() - def init_texte(self): - """ - Crée le label qui affiche le texte à l'intérieur du panneau + def init_texte(self): + """ + Crée le label qui affiche le texte à l'intérieur du panneau """ - fonte=fontes.standard - fr_texte = Frame(self.fenetre.interior(),height=60) + fonte=fontes.standard + fr_texte = Frame(self.fenetre.interior(),height=60) fr_texte.pack(side='top',fill='x',expand=1) Label(fr_texte,text = self.texte, font=fonte).place(relx=0.5,rely=0.5,anchor='center') - - def init_items_formulaire(self): - """ - Crée et affiche les items dans la boîte de dialogue - """ - self.radiobut = 0 - self.widgets = [] - self.item_widgets = {} - length_maxi = 0 + + def init_items_formulaire(self): + """ + Crée et affiche les items dans la boîte de dialogue + """ + self.radiobut = 0 + self.widgets = [] + self.item_widgets = {} + length_maxi = 0 for item in self.items: - if len(item[0])>length_maxi : length_maxi = len(item[0]) - window = self.fenetre.interior() - for item in self.items : - label,nature,nom_var,defaut = item - # création de la frame - fr_item = Frame(window,height=40,width=700) - fr_item.pack(side='top',fill='x',expand=1) - # création du label - Label(fr_item,text = label).place(relx=0.05,rely=0.4) + if len(item[0])>length_maxi : length_maxi = len(item[0]) + window = self.fenetre.interior() + for item in self.items : + label,nature,nom_var,defaut = item + # création de la frame + fr_item = Frame(window,height=40,width=700) + fr_item.pack(side='top',fill='x',expand=1) + # création du label + Label(fr_item,text = label).place(relx=0.05,rely=0.4) if nature in ('rep','file','cata'): - # création de l'entry - e_item = Entry(fr_item) - e_item.place(relx=0.5,rely=0.4,relwidth=0.45) - self.widgets.append(e_item) - self.item_widgets[item] = e_item - if defaut : e_item.insert(0,str(defaut)) - elif nature == 'YesNo': - # création de la StringVar - var = StringVar() - setattr(self,'item_'+nom_var,var) - var.set(defaut) - # création du radiobouton - rb1 = Radiobutton(fr_item,text='OUI',variable=var,value='OUI') - rb2 = Radiobutton(fr_item,text='NON',variable=var,value='NON') - rb1.place(relx=0.65,rely=0.5,anchor='center') - rb2.place(relx=0.80,rely=0.5,anchor='center') - self.widgets.append((rb1,rb2)) - self.item_widgets[item] = var - # détermination de la méthode à appliquer sur les boutons - if self.mode == 'query': - function = self.active - elif self.mode == 'display': - function = self.inactive - else: - return - # on applique la méthode sur les boutons (activation ou désactivation) - for widget in self.widgets : - if type(widget) == types.TupleType: - for widg in widget : - apply(function,(widg,),{}) - else: - apply(function,(widget,),{}) - - def active(self,widget): - """ - Active le widget passé en argument - """ - widget.configure(state='normal',bg='white') - - def inactive(self,widget): - """ - Inactive le widget passé en argument - """ - if not isinstance(widget,Radiobutton) : - widget.configure(state='disabled',bg='gray95') - else : - widget.configure(state='disabled') - -# -------------------------------------------------------------------------------- -# Validateurs des noms de répertoire, de fichiers et de catalogues -# -------------------------------------------------------------------------------- + # création de l'entry + e_item = Entry(fr_item) + e_item.place(relx=0.5,rely=0.4,relwidth=0.45) + self.widgets.append(e_item) + self.item_widgets[item] = e_item + if defaut : e_item.insert(0,str(defaut)) + elif nature == 'YesNo': + # création de la StringVar + var = StringVar() + setattr(self,'item_'+nom_var,var) + var.set(defaut) + # création du radiobouton + rb1 = Radiobutton(fr_item,text='OUI',variable=var,value='OUI') + rb2 = Radiobutton(fr_item,text='NON',variable=var,value='NON') + rb1.place(relx=0.65,rely=0.5,anchor='center') + rb2.place(relx=0.80,rely=0.5,anchor='center') + self.widgets.append((rb1,rb2)) + self.item_widgets[item] = var + # détermination de la méthode à appliquer sur les boutons + if self.mode == 'query': + function = self.active + elif self.mode == 'display': + function = self.inactive + else: + return + # on applique la méthode sur les boutons (activation ou désactivation) + for widget in self.widgets : + if type(widget) == types.TupleType: + for widg in widget : + apply(function,(widg,),{}) + else: + apply(function,(widget,),{}) + + def active(self,widget): + """ + Active le widget passé en argument + """ + widget.configure(state='normal',bg='white') + + def inactive(self,widget): + """ + Inactive le widget passé en argument + """ + if not isinstance(widget,Radiobutton) : + widget.configure(state='disabled',bg='gray95') + else : + widget.configure(state='disabled') + +# -------------------------------------------------------------------------------- +# Validateurs des noms de répertoire, de fichiers et de catalogues +# ------------------------------------------------------------------------------- def repvalidator(self,text): - """ - Teste si text peut faire référence à un répertoire ou non - Retourne 1 si valide, 0 sinon - """ + """ + Teste si text peut faire référence à un répertoire ou non + Retourne 1 si valide, 0 sinon + """ return os.path.isdir(text),'Répertoire introuvable : %s' %text def filevalidator(self,text): - """ - Teste si text peut faire référence à un fichier ou non - Retourne 1 si valide, 0 sinon - """ + """ + Teste si text peut faire référence à un fichier ou non + Retourne 1 si valide, 0 sinon + """ return os.path.isfile(text),'Fichier introuvable : %s' %text - - def catavalidator(self,text): - """ - Teste si text est un chemin d'accès valide à un catalogue - Retourne 1 si valide, 0 sinon - """ - return os.path.isfile(text),"Catalogue introuvable : %s" %text - -# -------------------------------------------------------------------------------- -# Méthodes callbacks des boutons et de fin -# -------------------------------------------------------------------------------- + + def catavalidator(self,text): + """ + Teste si text est un chemin d'accès valide à un catalogue + Retourne 1 si valide, 0 sinon + """ + return os.path.isfile(text),"Catalogue introuvable : %s" %text + +# -------------------------------------------------------------------------------- +# Méthodes callbacks des boutons et de fin +# -------------------------------------------------------------------------------- - def execute(self,txt): - """ - Cette commande est activée à chaque clic sur un bouton. - Redirige l'action sur la bonne méthode en fonction du bouton activé + def execute(self,txt): + """ + Cette commande est activée à chaque clic sur un bouton. + Redirige l'action sur la bonne méthode en fonction du bouton activé """ if txt == 'Valider': self.fini() @@ -522,26 +522,26 @@ class Formulaire: print "Nom de bouton inconnu" self.quit() - def fini(self): - """ - Commande qui termine le panneau et sauvegarde les nouvelles options - dans l'objet resultat (dictionnaire) + def fini(self): + """ + Commande qui termine le panneau et sauvegarde les nouvelles options + dans l'objet resultat (dictionnaire) """ dico={} - for item,widget in self.item_widgets.items(): - nom_var = item[2] + for item,widget in self.item_widgets.items(): + nom_var = item[2] type_var = item[1] - valeur = widget.get() - if self.d_validateurs.has_key(type_var): - test = self.d_validateurs[type_var](valeur) - if not test : - # une entrée n'est pas valide --> on la met en surbrillance et on quitte la méthode - # sans tuer la fenêtre bien sûr - widget.selection_range(0,END) + valeur = widget.get() + if self.d_validateurs.has_key(type_var): + test = self.d_validateurs[type_var](valeur) + if not test : + # une entrée n'est pas valide --> on la met en surbrillance et on quitte la méthode + # sans tuer la fenêtre bien sûr + widget.selection_range(0,END) return dico[nom_var] = valeur self.fenetre.destroy() - self.resultat=dico + self.resultat=dico def quit(self): self.fenetre.destroy() @@ -684,12 +684,16 @@ class ListeChoix : def get_liste_old(self): return self.liste + # PN attention à la gestion des paramétres + # cela retourne H = 1 , et ni H, ni 1 + # print repr(val) + # print val.__class__.__name__ def get_liste(self): l=[] for val in self.liste: try: - val = eval(val) - l.append(val) + v = eval(val) + l.append(v) except: l.append(val) return l @@ -751,9 +755,9 @@ class Affichage : self.progress.update() class Ask_Format_Fichier : - """ + """ Cette classe permet de créer une fenêtre Toplevel dans laquelle - on propose le choix du format de fichier de commandes à ouvrir + on propose le choix du format de fichier de commandes à ouvrir """ def __init__(self,appli): self.fenetre = Toplevel() -- 2.39.2