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