1 # -*- coding: utf-8 -*-
3 Ce module génère l'IHM permettant d'accéder à l'aide en ligne d'une application(ex: EFICAS)
4 Il analyse l'objet index passé en argument et génére automatiquement en conséquence le menu
12 Classe définissant l'IHM de l'appli d'aide
14 def __init__(self,objet,master=None):
25 Initialise les structures de données utlisées par l'objet
33 def init_window(self):
35 Initialise la fenêtre mère de l'appli
39 self.fenetre = fenetre
41 self.fenetre = fenetre.master
43 self.fenetre.title(self.objet.titre)
44 self.fenetre.geometry("700x700+50+50")
45 self.fenetre.resizable(1,1)
46 #self.fenetre.minsize(600,800)
47 #self.fenetre.maxsize(900,800)
48 self.fenetre.protocol("WM_DELETE_WINDOW",self.quit)
51 def init_frames(self):
53 Initialise les frames principales de l'appli
55 self.frame1 = Frame(self.fenetre,relief='flat',bd=2)
56 self.frame2 = Frame(self.fenetre,relief='flat',bd=2)
57 self.frame1.grid(row=0,column=0,sticky='news')
58 self.frame2.grid(row=1,column=0,sticky='news')
59 self.fenetre.grid_columnconfigure(0,weight=1,minsize=0)
60 self.fenetre.grid_rowconfigure(1,minsize=30)
61 self.fenetre.grid_rowconfigure(0,weight=1,minsize=0)
63 def init_buttons(self):
65 Crée les boutons dans le bas de la fenêtre
67 self.b_retour = Button(self.frame2,text = "Précédent",command=self.go_back)
68 self.b_retour.place(relx=0.33,rely=0.5,anchor='center')
69 Button(self.frame2,text="Fermer",command=self.quit).place(relx=0.66,rely=0.5,anchor='center')
74 Construit le widget Text qui accueillera l'index et les fichiers
76 self.scroll_v = Scrollbar(self.frame1)
77 self.scroll_v.grid(row=0,column=1,rowspan=2,sticky='nesw')
78 self.scroll_h = Scrollbar(self.frame1,orient='horizontal')
79 self.scroll_h.grid(row=1,column=0,rowspan=2,sticky='nesw')
80 self.canvas = Canvas(self.frame1,
83 scrollregion=(0,0,1000,1000),
84 yscrollcommand=self.scroll_v.set,
85 xscrollcommand=self.scroll_h.set)
86 self.canvas.grid(row=0,column=0,sticky='nesw')
87 self.scroll_v.configure(command=self.canvas.yview)
88 self.scroll_h.configure(command=self.canvas.xview)
89 self.frame1.grid_columnconfigure(0,weight=1,minsize=0)
90 self.frame1.grid_rowconfigure(0,weight=1,minsize=0)
91 self.frame1.grid_rowconfigure(1,minsize=10)
92 self.frame1.grid_columnconfigure(1,minsize=10)
96 Lance la construction dynamique de l'index en hyper texte
98 self.frame1.update_idletasks()
99 largeur = self.frame1.winfo_width()
100 self.canvas.create_rectangle(0,0,1,1,outline='white')
102 # Construction du titre encadré d'une bordure
103 titre = self.canvas.create_text(int(largeur/2),50,anchor='center',text=self.objet.titre,font="Helvetica 12 bold")
104 bbox = self.canvas.bbox(titre)
105 bordure = self.canvas.create_rectangle(bbox[0]-5,bbox[1]-5,bbox[2]+5,bbox[3]+5,
108 self.canvas.lower(bordure)
109 self.y_courant += 100
110 # Construction des items
111 for item in self.objet.l_items :
112 self.build_item(item,0)
113 # Affichage du texte dans le fichier associé (s'il existe)
114 if self.objet.fichier :
116 texte=open(self.objet.fichier,'r').read()
118 texte="Fichier %s inaccessible" % self.objet.fichier
119 self.canvas.create_text(10,self.y_courant+20,
122 # Configuration dynamique des boutons
123 self.config_boutons()
125 self.canvas.config(scrollregion=self.canvas.bbox('all'))
127 def config_boutons(self):
129 Activation du bouton précédent s'il y a lieu
132 self.b_retour.config(state='normal')
134 self.b_retour.config(state='disabled')
136 def build_item(self,item,padx):
138 Affiche l'item dans le menu décalé de padx
140 l = Label(self.canvas,
144 font="Helvetica 12 bold")
145 l.bind("<Button-1>",lambda e,s=self,o=item : s.update_objet(o))
146 l.bind("<Enter>",lambda e,s=self,o=l : s.select_label(o))
147 l.bind("<Leave>",lambda e,s=self,o=l : s.deselect_label(o))
148 self.canvas.create_window(self.padx[padx],self.y_courant,window=l,anchor='w')
150 for sub_item in item.l_items :
151 self.build_item(sub_item,padx+1)
153 def show_file(self,fichier):
155 Affiche le fichier passé en argument
157 print "on veut afficher :",fichier
159 def select_label(self,label):
161 Callback invoqué lorsque le label passé en argument est sélectionné
163 label.config(fg='white',bg='blue')
165 def deselect_label(self,label):
167 Callback invoqué lorsque le label passé en argument est sélectionné
169 label.config(bg='white',fg='blue')
173 Affiche l'item précédent
175 self.update_objet(self.historique[-1])
176 self.historique = self.historique[0:-1]
177 # Configuration dynamique des boutons
178 self.config_boutons()
180 def update_objet(self,new_objet):
182 Cette méthode remplace l'objet courant par new_objet.
183 Elle vide le widget text et affiche le nouvel objet
185 if not self.historique :
186 self.historique.append(self.objet)
187 elif new_objet is not self.historique[-1] :
188 self.historique.append(self.objet)
189 self.objet = new_objet
190 self.canvas.delete('all')
197 self.fenetre.destroy()