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