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.
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):
paramètres du JDC
"""
self.jdc.delete_param(self)
+ self.parent.delete_concept(self)
def update_context(self,d):
"""
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()
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):
objet.delete_mc_global()
objet.update_condition_bloc()
objet.supprime()
+ self.etape.modified()
self.fin_modif()
return 1
CONNECTOR.Emit(self,"supp",obj)
self.update_condition_bloc()
obj.supprime()
+ self.etape.modified()
self.fin_modif()
return 1
self.valeur = new_valeur
self.val = new_valeur
self.update_condition_bloc()
+ self.etape.modified()
self.fin_modif()
return 1
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):
"""
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())
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()
"""
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):
"""
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('')
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)
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())
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()
# 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)
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
""" 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
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')
# 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)
# 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):
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)
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):
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"
# 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)
# 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):
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
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:
# 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()
+