import Pmw
import os,sys,re,string
import types,fnmatch
+import traceback
from tkFileDialog import *
from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
def __init__(self,appli,titre="",texte=""):
self.appli=appli
self.fenetre = Toplevel()
+ self.fenetre.withdraw()
self.fenetre.configure(width = 800,height=500)
self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
self.fenetre.title("Visualisation du "+titre)
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_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
+ 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')
# affichage du texte
self.affiche_texte(self.texte)
+ self.zone_texte.config(state=DISABLED)
centerwindow(self.fenetre)
+ self.fenetre.deiconify()
def page_up(self,event):
event.widget.yview_scroll(-1, "page")
initialdir = self.appli.CONFIGURATION.initialdir,
title="Sauvegarde du "+self.titre)
if file :
- if not save_in_file(file,self.texte) :
+ if not save_in_file(file,self.texte,None) :
showerror("Sauvegarde impossible",
"Impossible de sauvegarder le texte dans le fichier spécifié\n"+
"Vérifiez les droits d'écriture")
"""
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.)
+
self.cardinal=cardinal
self.fenetre.configure(width = 320,height=400)
centerwindow(self.fenetre)
self.fenetre.title(titre)
self.but_save.configure(text="Ajouter",command=self.traite_selection)
# séparateur par défaut
- self.separateur = ";"
+ 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,
# 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')
+ 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.choose_separateur('espace')
def get_separateurs_autorises(self):
else:
self.separateur = nom_sep
- def traite_selection(self):
+ def tout(self):
+ liste=[]
+ texte=self.texte.splitlines()
+ for l in texte :
+ for mot in string.split(l,self.separateur):
+ if mot != '' and mot != ' ' and mot != self.separateur :
+ liste.append(mot)
+ self.traite_selection(liste)
+
+ def traite_selection(self,liste=None):
""" 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()
+ message=""
+ if liste == None:
+ 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
éléments dans le type voulu en cas de succès, sinon retourne None.
"""
liste_valeurs = []
- message = ""
+ message = ""
for chaine in liste:
if f_conversion:
try:
# définition des boutons
self.frame_boutons = Frame(self.fenetre)
- self.frame_boutons.place(relheight=0.3,relx=0,rely=0.7,relwidth=1.)
+ 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.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)
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
+ if len(item) == 4 :
+ label,nature,nom_var,defaut = item
+ chaine="Yes"
+ chaine2="No"
+ else :
+ label,nature,nom_var,defaut,chaine,chaine2 = item
# création de la frame
fr_item = Frame(window,height=40,width=700)
fr_item.pack(side='top',fill='x',expand=1)
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 = Radiobutton(fr_item,text=chaine,variable=var,value='OUI')
+ rb2 = Radiobutton(fr_item,text=chaine2,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))
class ListeChoix :
""" Cette classe est utilisée pour afficher une liste de choix passée en paramètre
en passant les commandes à lancer suivant différents bindings """
- def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre=''):
+ def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',
+ optionReturn=None, fonte_titre=fontes.standard_gras_souligne):
self.parent = parent
self.page = page
self.liste = liste
self.active = active
self.titre = titre
self.filtre = filtre
+ self.optionReturn = optionReturn
+ self.fonte_titre=fonte_titre
self.init()
def init(self):
def make_label_titre(self):
""" Crée le label correspondant au titre """
if self.titre == '' : return
- fonte_titre = fontes.standard_gras_souligne
self.label = Label(self.page,
text = self.titre,
- font = fonte_titre)
+ font = self.fonte_titre)
self.label.pack(side='top',pady=2)
def make_entry_filtre(self):
self.MCbox.pack(fill='y',expand=1,padx=2,pady=2)
self.MCbox.configure(yscrollcommand=self.MCscroll.set)
+
def affiche_liste(self):
""" Affiche la liste dans la fenêtre"""
liste_labels=[]
elif type(objet) in (types.StringType,types.IntType):
mot = objet
elif type(objet) == types.FloatType :
- #mot = repr_float(objet)
- mot = str(objet)
+ mot = self.parent.get_valeur_texte(objet)
+ if mot == "" :
+ mot = str(objet)
elif type(objet) == types.TupleType :
mot="("
premier=1
for val in objet:
- if (not premier):
- mot=mot+","
- else:
- premier=0
- mot=mot+str(val)
+ if (not premier):
+ mot=mot+","
+ else:
+ premier=0
+ valtexte = self.parent.get_valeur_texte(val)
+ if valtexte != "" :
+ mot=mot+valtexte
+ else:
+ mot=mot+str(val)
mot=mot+")"
else:
mot=`objet`
window=label,
stretch = 1)
self.MCbox.insert(END,'\n')
+ if self.optionReturn != None :
+ label.bind("<Return>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+ label.bind("<KP_Enter>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+ label.bind("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l))
+ label.bind("<Key-Down>",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l))
+ label.bind("<Key-Left>" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l))
+ label.bind("<Key-Up>" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l))
if self.active == 'oui':
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))
self.MCbox.config(state=DISABLED)
self.selection = None
+ self.dontselect=0
+ for event,callback in self.liste_commandes:
+ if event == "<Enter>":
+ self.selection=None,None,callback
+ break
+
+ def clear_marque(self):
+ try:
+ self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black')
+ self.arg_selected = ''
+ except :
+ pass
+
+ def surligne(self,marque):
+ try :
+ self.highlightitem(self.dico_labels[marque])
+ self.arg_selected = marque
+ except:
+ pass
+
+ def chooseitemsurligne(self,mot,label,commande):
+ """ Active la méthode de choix passée en argument"""
+ try:
+ mot=self.arg_selected
+ commande(mot)
+ except AsException,e:
+ raison=str(e)
+ showerror(raison.split('\n')[0],raison)
def chooseitem(self,mot,label,commande):
""" Active la méthode de choix passée en argument"""
except AsException,e:
raison=str(e)
showerror(raison.split('\n')[0],raison)
+
+ def selectNextItem(self,mot,label):
+ index=self.liste.index(mot)
+ indexsuivant=index+1
+ if indexsuivant > len(self.liste) -1:
+ indexsuivant=0
+ motsuivant=self.liste[indexsuivant]
+ labelsuivant=self.dico_labels[motsuivant]
+ index = self.MCbox.index(labelsuivant)
+ self.MCbox.see(index)
+ self.selectthis(motsuivant,labelsuivant,self.selection[2],)
+ self.dontselect=1
+
+ def selectPrevItem(self,mot,label):
+ index=self.liste.index(mot)
+ indexprec=index-1
+ motprec=self.liste[indexprec]
+ labelprec=self.dico_labels[motprec]
+ index = self.MCbox.index(labelprec)
+ self.MCbox.see(index)
+ self.selectthis(motprec,labelprec,self.selection[2],)
+ self.dontselect=1
- def selectitem(self,mot,label,commande) :
- """ Met l'item sélectionné (représenté par son label) en surbrillance
- et lance la commande associée au double-clic"""
+ def selectthis(self,mot,label,commande) :
+ self.clear_marque()
if self.selection != None :
self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
self.highlightitem(label)
self.selection = (mot,label,commande)
self.arg_selected = mot
- commande(mot)
+ if commande : commande(mot)
+
+ def selectitem(self,mot,label,commande) :
+ """ Met l'item sélectionné (représenté par son label) en surbrillance
+ et lance la commande associée au double-clic"""
+ if self.dontselect:
+ self.dontselect=0
+ return
+ self.selectthis(mot,label,commande)
def highlightitem(self,label) :
""" Met l'item représenté par son label en surbrillance """
+ label.focus_set()
label.configure(bg='#00008b',fg='white')
def markitem(self,label):
def deselectitem(self,label,mot='',commande=None) :
""" Remet l'item (représenté par son label) en noir"""
- label.configure(bg='gray95',fg='black')
+ if label:label.configure(bg='gray95',fg='black')
self.arg_selected = ''
- if commande != None : commande(mot)
+ if commande and mot : commande(mot)
def cherche_selected_item(self):
index=self.MCbox.index(self.selection[1])
return lign
def remove_selected_item(self):
- index=self.MCbox.index(self.selection[1])
+ try :
+ index=self.MCbox.index(self.selection[1])
+ except :
+ index=self.MCbox.index(self.dico_labels[self.arg_selected] )
lign,col=map(int,string.split(index,'.'))
del self.liste[lign-1]
self.affiche_liste()
FILTRE = string.upper(filtre)
for arg in self.liste :
if fnmatch.fnmatch(arg,filtre) or fnmatch.fnmatch(arg,FILTRE) :
- self.highlightitem(self.dico_labels[arg])
- index = self.MCbox.index(self.dico_labels[arg])
+ label=self.dico_labels[arg]
+ index = self.MCbox.index(label)
self.MCbox.see(index)
- self.arg_selected = arg
+ self.selectitem(arg,label,self.selection[2])
break
- def get_liste_old(self):
- return self.liste
+ #try :
+ #self.dico_labels[self.arg_selected].focus_set()
+ #except :
+ #pass
+
# PN attention à la gestion des paramétres
# cela retourne H = 1 , et ni H, ni 1
def put_liste(self,liste):
self.liste = liste
self.affiche_liste()
-
+
class Affichage :
""" Cette classe permet d'afficher au lancement d'EFICAS le message
d'attente et la barre de progression"""
Cette classe est utilisée pour afficher une liste de commandes classées par
groupes. L'utilisateur peut réaliser des actions de selection
qui déclenchent des actions spécifiées par les bindings contenus dans liste_commandes
+ Exemple de binding:
+ liste_commandes = (("<Enter>",self.selectCmd),
+ ("<Leave>",self.deselectCmd),
+ ("<Double-Button-1>",self.defCmd))
+ Il s'agit d'une liste de doublets dont le premier element est un evenement et le
+ deuxieme un callback a appeler sur l'evenement en question.
+
"""
def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
- active ='oui',filtre='non',titre=''):
+ active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
self.parent = parent
self.page = page
self.liste_groupes = liste_groupes
self.active = active
self.titre = titre
self.filtre = filtre
+ self.optionReturn = optionReturn
+ self.fonte_titre=fonte_titre
self.init()
def affiche_liste(self):
window=label,
stretch = 1)
self.MCbox.insert(END,'\n')
+
+ def null(*tp,**args): return
+
if self.active == 'oui':
- label.bind(self.liste_commandes[0][0],
- lambda e,s=self,c=self.liste_commandes[0][1],x=cmd,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=cmd,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=cmd,l=label : s.chooseitem(x,l,c))
+ # Traitement par defaut des evenements
+ label.bind("<Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c))
+ label.bind("<Leave>",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c))
+ label.bind("<Double-Button-1>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+ label.bind("<Return>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+ label.bind("<KP_Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+ label.bind("<Key-Right>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+ label.bind("<Key-Down>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+ label.bind("<Key-Left>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+ label.bind("<Key-Up>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+
+ # Si des callbacks sont definis on les utilise
+ for event,callback in self.liste_commandes:
+ if event == "<Enter>":
+ label.bind("<Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c))
+ elif event == "<Leave>":
+ label.bind("<Leave>",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c))
+ elif event == "<Double-Button-1>":
+ label.bind("<Double-Button-1>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+ elif event == "<Return>":
+ label.bind("<Return>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+ elif event == "<KP_Enter>":
+ label.bind("<KP_Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+ elif event == "<Key-Right>":
+ label.bind("<Key-Right>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+ elif event == "<Key-Down>":
+ label.bind("<Key-Down>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+ elif event == "<Key-Left>":
+ label.bind("<Key-Left>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+ elif event == "<Key-Up>":
+ label.bind("<Key-Up>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+ else:
+ label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c())
for marque in self.liste_marques:
try:
self.MCbox.config(state=DISABLED)
self.selection = None
+ self.dontselect=0
+ for event,callback in self.liste_commandes:
+ if event == "<Enter>":
+ self.selection=None,None,callback
+ break
+
+ def selectPrevItem(self,mot,label,callback,group,cmd):
+ g=self.liste_groupes.index(group)
+ liste_commandes=self.dict_groupes[group]
+ c=liste_commandes.index(cmd)
+ if c > 0:
+ co=liste_commandes[c-1]
+ else:
+ # debut de liste. On passe au groupe precedent
+ if g > 0:
+ gr=self.liste_groupes[g-1]
+ co=self.dict_groupes[gr][-1]
+ else:
+ # debut des groupes. On ne fait rien
+ return
+ # On a trouve l'item precedent
+ labelsuivant=self.dico_labels[co]
+ index = self.MCbox.index(labelsuivant)
+ self.MCbox.see(index)
+ self.selectthis(co,labelsuivant,self.selection[2],)
+ self.dontselect=1
+
+ def selectNextItem(self,mot,label,callback,group,cmd):
+ g=self.liste_groupes.index(group)
+ liste_commandes=self.dict_groupes[group]
+ c=liste_commandes.index(cmd)
+ try:
+ co=liste_commandes[c+1]
+ except:
+ # fin de liste. On passe au groupe suivant
+ try:
+ gr=self.liste_groupes[g+1]
+ co=self.dict_groupes[gr][0]
+ except:
+ # fin des groupes. On ne fait rien
+ return
+ # On a trouve l'item suivant
+ labelsuivant=self.dico_labels[co]
+ index = self.MCbox.index(labelsuivant)
+ self.MCbox.see(index)
+ self.selectthis(co,labelsuivant,self.selection[2],)
+ self.dontselect=1
def entry_changed(self,event=None):
"""
de l'entry et frappe <Return>
"""
if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
+
filtre = self.entry.get()+"*"
FILTRE = string.upper(filtre)
#
#
for grp in self.liste_groupes:
if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) :
- index = self.MCbox.index(self.dico_labels[grp])
+ cmd=self.dict_groupes[grp][0]
+ label=self.dico_labels[cmd]
+ index = self.MCbox.index(label)
self.MCbox.see(index)
- # On ne selectionne pas le groupe
- #self.arg_selected = grp
+ self.selectitem(cmd,label,self.selection[2])
# On a trouve un groupe on arrete la recherche
return
for grp in self.liste_groupes:
for cmd in self.dict_groupes[grp] :
if fnmatch.fnmatch(cmd,filtre) or fnmatch.fnmatch(cmd,FILTRE) :
- self.highlightitem(self.dico_labels[cmd])
- index = self.MCbox.index(self.dico_labels[cmd])
+ label=self.dico_labels[cmd]
+ index = self.MCbox.index(label)
self.MCbox.see(index)
- self.arg_selected = cmd
+ self.selectitem(cmd,label,self.selection[2])
# On a trouve une commande on arrete la recherche
return