]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/panels.py
Salome HOME
PN : pour accepter entrer dans le clavier numérique
[tools/eficas.git] / Editeur / panels.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 import string
22 import os
23 from Tkinter import *
24 import Pmw
25 import time
26 import traceback
27
28 import widgets
29 from widgets import ListeChoix
30 from widgets import ListeChoixParGroupes
31 import prefs
32 import options
33
34 SEPARATEUR = '-'*30
35
36
37 class Panel(Frame) :
38   """
39   Classe servant de classe mère à toutes celles représentant les
40   panneaux à afficher en fonction de la nature de l'objet en cours
41   Elle est toujours dérivée.
42   """
43   def __init__(self,parent,panneau,node) :
44       # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
45       # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
46       # modified et la methode init_modif
47       self.parent=parent
48       self.panneau = panneau
49       self.node=node
50       Frame.__init__(self,self.panneau)
51       self.place(x=0,y=0,relheight=1,relwidth=1)
52       self.creer_boutons()
53       self.init()
54
55   def __del__(self):
56       """ appele a la destruction du panel """
57       #print "PANEL DETRUIT"
58
59   def update_panel(self):
60       """Methode appele pour demander une mise a jour du panneau"""
61
62   def destroy(self):
63       Frame.destroy(self)
64       self.panneau=None
65       self.parent=None
66       # Because on herite de Frame
67       self.master=None
68       # On supprime explicitement les references aux objets Tk
69       self.nb=None
70       self.fr_but=None
71       self.bouton_cata=None
72       self.bouton_doc=None
73       self.bouton_com=None
74       self.bouton_sup=None
75       #self.frame_eval=None
76       self.label=None
77       self.frame_boutons=None
78       self.frame_comment=None
79       self.frame_param=None
80       # On termine la suppression de facon brutale (objets Tk et non Tk)
81       for k in self.__dict__.keys():
82          # il est plus prudent de ne pas détruire le lien sur le Node
83          # si on voulait mettre l'attribut node à None, il faudrait
84          # que tous les appels à node.parent.select() apparaissent après
85          # toutes les autres actions liées au panel (node.item.isglobal(), ...)
86          if k != 'node' : setattr(self,k,None)
87
88   def creer_boutons(self):
89       """
90       Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
91       (à droite sous les onglets )
92       """
93       self.fr_but = Frame(self,height=30)
94       self.fr_but.pack(side='bottom',fill='x')
95       self.bouton_com = Button(self.fr_but,
96                                text = 'Commentariser',
97                                command = self.ajout_commentaire,
98                                width=14)
99       self.bouton_sup = Button(self.fr_but,
100                                text = "Supprimer",
101                                command=self.supprimer,
102                                width=14)
103       self.bouton_doc = Button(self.fr_but,
104                                text="Documentation",
105                                command=self.visu_doc,
106                                width=14)
107       self.bouton_cata = Button(self.fr_but,
108                                 text = "Catalogue",
109                                 command = self.show_catalogue,
110                                 width=14)
111       if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
112           self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='center')
113           self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='center')
114           self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='center')
115       else:
116           self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='center')
117           self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='center')
118
119   def show_catalogue(self):
120       try:
121           genea = self.node.item.get_genealogie()
122           self.parent.appli.browser_catalogue_objet(genea)
123       except Exception,e:
124           traceback.print_exc()
125       
126   def efface(self):
127       self.node.efface()
128
129 # ------------------------------------------------------------------------
130 #     Méthodes permettant d'ajouter des commentaires, des paramètres
131 #                     et des objets EVAL.
132 #       Ces méthodes sont utilisées par les panneaux des JDC,ETAPE,
133 #                 COMMENTAIRE et PARAMETRE
134 # ------------------------------------------------------------------------
135
136   def ajout_commentaire(self,ind='after'):
137       """
138       Ajoute un commentaire à l'intérieur du JDC :
139       - si ind='after'  : l'ajoute après l'objet courant
140       - si ind='before' : l'ajoute avant.
141       """
142       if self.parent.modified == 'n' : self.parent.init_modif()
143       return self.node.append_brother("COMMENTAIRE",ind)
144     
145   def ajout_commentaire_first(self):
146       """
147       Ajoute un commentaire en début de JDC
148       """
149       if self.parent.modified == 'n' : self.parent.init_modif()
150       return self.node.append_child("COMMENTAIRE",'first')
151
152   def ajout_parametre(self,ind='after'):
153       """
154       Ajoute un parametre à l'intérieur du JDC :
155       - si ind='after'  : l'ajoute après l'objet courant
156       - si ind='before' : l'ajoute avant.
157       """
158       if self.parent.modified == 'n' : self.parent.init_modif()
159       return self.node.append_brother("PARAMETRE",ind)
160     
161   def ajout_parametre_first(self):
162       """
163       Ajoute un parametre en début de JDC
164       """
165       if self.parent.modified == 'n' : self.parent.init_modif()
166       return self.node.append_child("PARAMETRE",'first')
167
168 #  def ajout_parametre_eval(self,ind='after'):
169 #      """
170 #      Ajoute un paramètre EVAL à l'intérieur du JDC :
171 #      - si ind='after'  : l'ajoute après l'objet courant
172 #      - si ind='before' : l'ajoute avant.
173 #      """
174 #      if self.parent.modified == 'n' : self.parent.init_modif()
175 #      return self.node.append_brother("PARAMETRE_EVAL",ind)
176     
177 #  def ajout_parametre_eval_first(self):
178 #      """
179 #      Ajoute un paramètre EVAL en début de JDC
180 #      """
181 #      if self.parent.modified == 'n' : self.parent.init_modif()
182 #      return self.node.append_child("PARAMETRE_EVAL",'first')
183     
184 # ------------------------------------------------------------------------
185    
186   def visu_doc(self):
187       """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
188         - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
189         - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
190       cle_doc = self.node.item.get_docu()
191       if cle_doc == None : return
192       cle_doc = string.replace(cle_doc,'.','')
193       cle_doc = string.replace(cle_doc,'-','')
194       commande = self.parent.appli.CONFIGURATION.exec_acrobat
195       nom_fichier = cle_doc+".pdf"
196       fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,
197                                        nom_fichier))
198       if os.name == 'nt':
199           os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
200       elif os.name == 'posix':
201           script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
202           pid = os.system(script)
203       
204   def supprimer(self):
205       """
206       Suppression du noeud courant
207       """
208       # On signale au parent du panel (le JDCDisplay) une modification 
209       self.parent.init_modif()
210       self.node.delete()
211       
212   def affiche(self):
213       """ Force l'affichage des fenêtres en cours """
214       self.tkraise()
215
216   def selectMC(self,name):
217       """ On retrouve le mot-clé sous le curseur pour affichage du fr """
218       cmd=self.node.item.get_definition()
219       texte_infos = ''
220       for e in cmd.entites.keys() :
221           if e == name :
222               texte_infos=getattr(cmd.entites[e],prefs.lang)
223               break
224       if texte_infos == '' : texte_infos="Pas d'infos disponibles"
225       self.parent.appli.affiche_infos(texte_infos)
226
227   def defMC(self,name):
228       """ On ajoute un mot-clé à la commande : subnode """
229       if name == SEPARATEUR:return
230       if self.parent.modified == 'n' : self.parent.init_modif()
231       if name != "COMMENTAIRE":
232           self.node.append_child(name)
233       else :
234           self.ajout_commentaire()    
235
236   def selectCmd(self,name):
237       """ On retrouve la commande sous le curseur pour affichage du fr """
238       if name != 'COMMENTAIRE' and name != SEPARATEUR:
239           texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
240           self.parent.appli.affiche_infos(texte_infos)
241           
242   def defCmd(self,name):
243       """
244       On ajoute une commande après la commande selectionnée : after
245       ou bien on ajoute un commentaire
246       """
247       if name == SEPARATEUR:return
248       if self.parent.modified == 'n' : self.parent.init_modif()
249       if name != "COMMENTAIRE":
250           #parent=self.node.parent
251           #new_obj = parent.item.append_child(name,self.node.item.getObject())
252           #parent.children[parent.children.index(self.node)+1].select()
253           new_node = self.node.append_brother(name,'after')
254       else :
255           new_node = self.ajout_commentaire()
256
257   def defCmdFirst(self,name):
258       """ On ajoute une commande ou un commentaire au début du fichier de commandes """
259       if name == SEPARATEUR:return
260       if self.parent.modified == 'n' : self.parent.init_modif()
261       if name != "COMMENTAIRE":
262           #new_obj = self.node.item.append_child(name,'first')
263           #self.node.children[0].select()
264           new_node = self.node.append_child(name,'first')
265       else :
266           new_node = self.ajout_commentaire_first()
267         
268 class OngletPanel(Panel) :
269   """ Cette classe est virtuelle et doit être dérivée
270       Elle contient les principales méthodes d'affichage des différents onglets"""
271
272   def raisecmd(self,page):
273       self.nb.page(page).focus_set()
274       if page == 'Concept':
275           try:
276               self._any.focus()
277           except:
278               pass
279       elif page == 'Commande':
280           try:
281               self.command_entry.component('entry').focus()
282           except:
283               pass
284
285
286   def affiche(self):
287       page=self.nb.getcurselection()
288       self.nb.page(page).focus_set()
289       if page == 'Concept':
290           try:
291 #             _any est un pointeur sur entry
292 #             component est une methode de pmw 
293 #             a priori, jamais ok
294               self._any.component('entry').focus_set()
295           except:
296               pass
297       self.tkraise()
298
299 # ------------------------------------------------------------------------
300 #     Méthodes permettant d'afficher des pages partagées par différents
301 #           types d'objets (règles,mots-clés,concept,...)
302 # ------------------------------------------------------------------------
303
304   def makeConceptPage(self,page):
305       """
306       Crée la page de saisie du nom du concept
307       """
308       self.label = Label(page,text='Nom du concept :')
309       self.label.place(relx=0.1,rely=0.4)
310       self._any = Entry(page,relief='sunken')
311       self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
312       self._any.bind("<Return>",lambda e,s=self:s.execConcept())
313       self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
314       self._any.insert(0,self.node.item.GetText())
315       type_sd = self.node.item.get_type_sd_prod()
316       if type_sd :
317           txt = "L'opérateur courant retourne un objet de type %s" %type_sd
318           self.label = Label(page, text = txt)
319           self.label.place(relx=0.5,rely=0.55,anchor='n')
320       self._any.focus()
321       # aide associée au panneau
322       bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
323       au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
324       page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
325       page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
326         
327   def makeMoclesPage(self,page):
328       """
329       Crée la page qui affiche la liste des mots-clés que l'on peut
330       encore ajouter
331       """
332       genea =self.node.item.get_genealogie()
333       jdc = self.node.item.get_jdc()
334       liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
335       liste_commandes = (("<Enter>",self.selectMC),
336                          ("<Leave>",self.deselectMC),
337                          ("<Double-Button-1>",self.defMC))
338       Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis")
339       Liste.affiche_liste()
340       # aide associée au panneau
341       bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
342       la commande en cours d'édition"""
343       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
344       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
345
346   def makeCommentairePage(self,page):
347       label = Label(page,text = "Insérer un commentaire :")
348       label.grid(column = 0, row = 2)
349       but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
350       but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
351       but_avant.grid(column = 1,row =2)
352       but_apres.grid(column = 1,row =3)
353       
354   def makeCommandePage(self,page):
355       """
356          Cree l'onglet
357       """
358       frame1 = Frame(page,height = 20)
359       frame1.pack(side='top',fill='x')
360       label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
361       label.pack(side='top')
362       frame2 = Frame(page)
363       frame2.pack(side='top',fill='both',expand=1)
364       liste_commandes = (("<Enter>",self.selectCmd),
365                          ("<Leave>",self.deselectCmd),
366                          ("<Double-Button-1>",self.defCmd))
367       if options.affichage_commandes == "alphabetic":
368          liste_cmd = self.get_liste_cmd()
369          Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
370                                    filtre='oui',titre = "Commandes",optionReturn="oui")
371       else:
372          liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
373          liste_groupes,dict_groupes=self.get_groups()
374          Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
375                                       liste_commandes = liste_commandes,
376                                       filtre='oui',titre = "Commandes",optionReturn="oui")
377       Liste.affiche_liste()
378       self.command_entry=Liste.entry
379       # aide associée au panneau
380       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
381       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
382       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
383       global panneauCommande
384       panneauCommande=self
385
386   def makeJDCPage(self,page):
387       """
388       Crée la page correspondant à un objet de type JDC
389       """
390       liste_commandes = (("<Enter>",self.selectCmd),
391                          ("<Leave>",self.deselectCmd),
392                          ("<Double-Button-1>",self.defCmdFirst))
393       if options.affichage_commandes == "alphabetic":
394          liste_cmd = self.get_liste_cmd()
395          Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
396                             filtre='oui',titre = "Commandes",optionReturn="oui")
397       else:
398          liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
399          liste_groupes,dict_groupes=self.get_groups()
400          Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
401                                       liste_commandes = liste_commandes,
402                                       filtre='oui',titre = "Commandes",optionReturn="oui")
403       Liste.affiche_liste()
404        # aide associée au panneau
405       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
406       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
407       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
408
409   def makeReglesPage(self,page) :
410       """
411       Crée la page qui affiche la liste des règles avec celle qui ne sont
412       pas respectées en rouge
413       """
414       regles = []
415       regles = self.node.item.get_regles()
416       dictionnaire = self.node.item.get_mc_presents()
417       texte_regles = []
418       l_regles_en_defaut=[]
419       if len(regles) > 0:
420         i = 0
421         for regle in regles :
422           texte_regles.append(regle.gettext())
423           texte,test = regle.verif(dictionnaire)
424           if test == 0 : l_regles_en_defaut.append(i)
425           i = i+1
426       Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
427       Liste.affiche_liste()
428       # aide associée au panneau
429       bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
430       en cours d'édition.
431       - en noir : règles valides
432       - en rouge : règles violées"""
433       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
434       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
435
436   def makeParamCommentPage_for_etape(self,page):
437       """
438       Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
439       ou un paramètre, avant ou après le noeud courant dans l'arbre.
440       Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
441       les commentaires inter commandes et les paramètres
442       """
443       # les frame ...
444       self.frame_comment = Frame(page,bd=1,relief='raised')
445       self.frame_param   = Frame(page,bd=1,relief='raised')
446       #self.frame_eval    = Frame(page,bd=1,relief='raised')
447       self.frame_boutons = Frame(page,bd=1,relief='raised')
448       self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
449       self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
450       #self.frame_eval.place(relx=0,rely=0.56,relwidth=1,relheight=0.28)
451       self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
452       # remplissage de la frame commentaire
453       Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
454       but_comment_avant = Button(self.frame_comment,
455                                  text = "AVANT "+self.node.item.get_nom(),
456                                  command = lambda s=self :s.ajout_commentaire(ind = 'before'))
457       but_comment_apres = Button(self.frame_comment,
458                                  text = "APRES "+self.node.item.get_nom(),
459                                  command = self.ajout_commentaire)
460       but_comment_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
461       but_comment_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)
462       # remplissage de la frame paramètre
463       Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
464       but_param_avant = Button(self.frame_param,
465                                  text = "AVANT "+self.node.item.get_nom(),
466                                  command = lambda s=self :s.ajout_parametre(ind = 'before'))
467       but_param_apres = Button(self.frame_param,
468                                  text = "APRES "+self.node.item.get_nom(),
469                                  command = self.ajout_parametre)
470       but_param_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
471       but_param_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)
472       # remplissage de la frame eval
473       #Label(self.frame_eval,text="Insérer un paramètre EVAL :").place(relx=0.1,rely=0.5,anchor='w')
474           #Label(self.frame_eval,text='Non encore disponible').place(relx=0.6,rely=0.5,anchor='w')
475       #but_eval_avant = Button(self.frame_eval,
476       #                        text = "AVANT "+self.node.item.get_nom(),
477       #                        command = lambda s=self :s.ajout_parametre_eval(ind = 'before'))
478       #but_eval_apres = Button(self.frame_eval,
479       #                        text = "APRES "+self.node.item.get_nom(),
480       #                        command = self.ajout_parametre_eval)
481       #but_eval_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
482       #but_eval_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)      
483       # remplissage de la frame boutons
484       Button(self.frame_boutons,
485              text="Commentariser toute la commande",
486              command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
487     
488   def deselectMC(self,name):
489       self.parent.appli.affiche_infos('')
490     
491   def get_liste_cmd_BAK(self):
492       raise "OBSOLETE"
493       listeCmd = self.cata.listCmd()
494       return listeCmd
495
496   def get_groups(self):
497       jdc=self.node.item.object.get_jdc_root()
498       return jdc.get_groups()
499
500   def get_liste_cmd(self):
501       #print "get_liste_cmd",self.node.item.object
502       jdc=self.node.item.object.get_jdc_root()
503       listeCmd = jdc.get_liste_cmd()
504       return listeCmd
505
506   def deselectCmd(self,name):
507       self.parent.appli.affiche_infos('')
508     
509   def execConcept(self):
510       """
511       Nomme le concept SD retourné par l'étape
512       """
513       if not hasattr(self,'valeur_choisie'):
514           nom = self._any.get()
515       else:
516           nom = self.valeur_choisie.get()
517       nom = string.strip(nom)
518       if nom == '' : return # si pas de nom, on ressort sans rien faire ...
519       if self.parent.modified == 'n' : self.parent.init_modif()
520       test,mess = self.node.item.nomme_sd(nom)
521       #self.node.verif()
522       #self.node.racine.update()
523       self.parent.appli.affiche_infos(mess)
524   
525   def changed(self):
526       pass
527
528   def comment_commande(self):
529     """
530     Cette méthode a pour but de commentariser la commande pointée par self.node
531     """
532     # On traite par une exception le cas où l'utilisateur final cherche à désactiver
533     # (commentariser) un commentaire.
534     try :
535         pos=self.node.parent.children.index(self.node)
536         commande_comment = self.node.item.get_objet_commentarise()
537         # On signale au parent du panel (le JDCDisplay) une modification
538         self.parent.init_modif()
539         self.node.parent.children[pos].select()
540     except Exception,e:
541         traceback.print_exc()
542         widgets.showerror("TOO BAD",str(e))
543     return
544
545       
546 class Panel_Inactif(Panel):
547   """
548      Cette classe sert à définir un panneau dans lequel on dit que le noeud 
549      sélectionné n'est pas actif
550   """
551   def __init__(self,parent,panneau,node) :
552       self.parent=parent
553       self.panneau = panneau
554       self.node=node
555       Frame.__init__(self,self.panneau)
556       self.place(x=0,y=0,relheight=1,relwidth=1)
557       self.creer_texte()
558
559   def creer_texte(self):
560       texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
561       texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
562       longueur = int(self.panneau.winfo_width()*0.8)
563       self.label = Label(self,text=texte,wraplength=longueur,justify='center')
564       self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
565       self.bouton_sup = Button(self,
566                                text = "Supprimer",
567                                command=self.supprimer,
568                                width=14)
569       self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
570
571
572 if __name__ == "__main__" : pass