]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/panels.py
Salome HOME
CCAR: modifications pour permettre l'edition des includes et poursuites
[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.insert(0,self.node.item.GetText())
314       type_sd = self.node.item.get_type_sd_prod()
315       if type_sd :
316           txt = "L'opérateur courant retourne un objet de type %s" %type_sd
317           self.label = Label(page, text = txt)
318           self.label.place(relx=0.5,rely=0.55,anchor='n')
319       self._any.focus()
320       # aide associée au panneau
321       bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
322       au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
323       page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
324       page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
325         
326   def makeMoclesPage(self,page):
327       """
328       Crée la page qui affiche la liste des mots-clés que l'on peut
329       encore ajouter
330       """
331       genea =self.node.item.get_genealogie()
332       jdc = self.node.item.get_jdc()
333       liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
334       liste_commandes = (("<Enter>",self.selectMC),
335                          ("<Leave>",self.deselectMC),
336                          ("<Double-Button-1>",self.defMC))
337       Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis")
338       Liste.affiche_liste()
339       # aide associée au panneau
340       bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
341       la commande en cours d'édition"""
342       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
343       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
344
345   def makeCommentairePage(self,page):
346       label = Label(page,text = "Insérer un commentaire :")
347       label.grid(column = 0, row = 2)
348       but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
349       but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
350       but_avant.grid(column = 1,row =2)
351       but_apres.grid(column = 1,row =3)
352       
353   def makeCommandePage(self,page):
354       """
355          Cree l'onglet
356       """
357       frame1 = Frame(page,height = 20)
358       frame1.pack(side='top',fill='x')
359       label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
360       label.pack(side='top')
361       frame2 = Frame(page)
362       frame2.pack(side='top',fill='both',expand=1)
363       liste_commandes = (("<Enter>",self.selectCmd),
364                          ("<Leave>",self.deselectCmd),
365                          ("<Double-Button-1>",self.defCmd))
366       if options.affichage_commandes == "alphabetic":
367          liste_cmd = self.get_liste_cmd()
368          Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
369                                    filtre='oui',titre = "Commandes",optionReturn="oui")
370       else:
371          liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
372          liste_groupes,dict_groupes=self.get_groups()
373          Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
374                                       liste_commandes = liste_commandes,
375                                       filtre='oui',titre = "Commandes",optionReturn="oui")
376       Liste.affiche_liste()
377       self.command_entry=Liste.entry
378       # aide associée au panneau
379       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
380       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
381       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
382       global panneauCommande
383       panneauCommande=self
384
385   def makeJDCPage(self,page):
386       """
387       Crée la page correspondant à un objet de type JDC
388       """
389       liste_commandes = (("<Enter>",self.selectCmd),
390                          ("<Leave>",self.deselectCmd),
391                          ("<Double-Button-1>",self.defCmdFirst))
392       if options.affichage_commandes == "alphabetic":
393          liste_cmd = self.get_liste_cmd()
394          Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
395                             filtre='oui',titre = "Commandes",optionReturn="oui")
396       else:
397          liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
398          liste_groupes,dict_groupes=self.get_groups()
399          Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
400                                       liste_commandes = liste_commandes,
401                                       filtre='oui',titre = "Commandes",optionReturn="oui")
402       Liste.affiche_liste()
403        # aide associée au panneau
404       bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
405       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
406       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
407
408   def makeReglesPage(self,page) :
409       """
410       Crée la page qui affiche la liste des règles avec celle qui ne sont
411       pas respectées en rouge
412       """
413       regles = []
414       regles = self.node.item.get_regles()
415       dictionnaire = self.node.item.get_mc_presents()
416       texte_regles = []
417       l_regles_en_defaut=[]
418       if len(regles) > 0:
419         i = 0
420         for regle in regles :
421           texte_regles.append(regle.gettext())
422           texte,test = regle.verif(dictionnaire)
423           if test == 0 : l_regles_en_defaut.append(i)
424           i = i+1
425       Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
426       Liste.affiche_liste()
427       # aide associée au panneau
428       bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
429       en cours d'édition.
430       - en noir : règles valides
431       - en rouge : règles violées"""
432       Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
433       Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
434
435   def makeParamCommentPage_for_etape(self,page):
436       """
437       Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
438       ou un paramètre, avant ou après le noeud courant dans l'arbre.
439       Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
440       les commentaires inter commandes et les paramètres
441       """
442       # les frame ...
443       self.frame_comment = Frame(page,bd=1,relief='raised')
444       self.frame_param   = Frame(page,bd=1,relief='raised')
445       #self.frame_eval    = Frame(page,bd=1,relief='raised')
446       self.frame_boutons = Frame(page,bd=1,relief='raised')
447       self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
448       self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
449       #self.frame_eval.place(relx=0,rely=0.56,relwidth=1,relheight=0.28)
450       self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
451       # remplissage de la frame commentaire
452       Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
453       but_comment_avant = Button(self.frame_comment,
454                                  text = "AVANT "+self.node.item.get_nom(),
455                                  command = lambda s=self :s.ajout_commentaire(ind = 'before'))
456       but_comment_apres = Button(self.frame_comment,
457                                  text = "APRES "+self.node.item.get_nom(),
458                                  command = self.ajout_commentaire)
459       but_comment_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
460       but_comment_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)
461       # remplissage de la frame paramètre
462       Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
463       but_param_avant = Button(self.frame_param,
464                                  text = "AVANT "+self.node.item.get_nom(),
465                                  command = lambda s=self :s.ajout_parametre(ind = 'before'))
466       but_param_apres = Button(self.frame_param,
467                                  text = "APRES "+self.node.item.get_nom(),
468                                  command = self.ajout_parametre)
469       but_param_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
470       but_param_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)
471       # remplissage de la frame eval
472       #Label(self.frame_eval,text="Insérer un paramètre EVAL :").place(relx=0.1,rely=0.5,anchor='w')
473           #Label(self.frame_eval,text='Non encore disponible').place(relx=0.6,rely=0.5,anchor='w')
474       #but_eval_avant = Button(self.frame_eval,
475       #                        text = "AVANT "+self.node.item.get_nom(),
476       #                        command = lambda s=self :s.ajout_parametre_eval(ind = 'before'))
477       #but_eval_apres = Button(self.frame_eval,
478       #                        text = "APRES "+self.node.item.get_nom(),
479       #                        command = self.ajout_parametre_eval)
480       #but_eval_avant.place(relx=0.6,rely=0.3,anchor='w',relwidth=0.3)
481       #but_eval_apres.place(relx=0.6,rely=0.7,anchor='w',relwidth=0.3)      
482       # remplissage de la frame boutons
483       Button(self.frame_boutons,
484              text="Commentariser toute la commande",
485              command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
486     
487   def deselectMC(self,name):
488       self.parent.appli.affiche_infos('')
489     
490   def get_liste_cmd_BAK(self):
491       raise "OBSOLETE"
492       listeCmd = self.cata.listCmd()
493       return listeCmd
494
495   def get_groups(self):
496       jdc=self.node.item.object.get_jdc_root()
497       return jdc.get_groups()
498
499   def get_liste_cmd(self):
500       #print "get_liste_cmd",self.node.item.object
501       jdc=self.node.item.object.get_jdc_root()
502       listeCmd = jdc.get_liste_cmd()
503       return listeCmd
504
505   def deselectCmd(self,name):
506       self.parent.appli.affiche_infos('')
507     
508   def execConcept(self):
509       """
510       Nomme le concept SD retourné par l'étape
511       """
512       if not hasattr(self,'valeur_choisie'):
513           nom = self._any.get()
514       else:
515           nom = self.valeur_choisie.get()
516       nom = string.strip(nom)
517       if nom == '' : return # si pas de nom, on ressort sans rien faire ...
518       if self.parent.modified == 'n' : self.parent.init_modif()
519       test,mess = self.node.item.nomme_sd(nom)
520       #self.node.verif()
521       #self.node.racine.update()
522       self.parent.appli.affiche_infos(mess)
523   
524   def changed(self):
525       pass
526
527   def comment_commande(self):
528     """
529     Cette méthode a pour but de commentariser la commande pointée par self.node
530     """
531     # On traite par une exception le cas où l'utilisateur final cherche à désactiver
532     # (commentariser) un commentaire.
533     try :
534         pos=self.node.parent.children.index(self.node)
535         commande_comment = self.node.item.get_objet_commentarise()
536         # On signale au parent du panel (le JDCDisplay) une modification
537         self.parent.init_modif()
538         self.node.parent.children[pos].select()
539     except Exception,e:
540         traceback.print_exc()
541         widgets.showerror("TOO BAD",str(e))
542     return
543
544       
545 class Panel_Inactif(Panel):
546   """
547      Cette classe sert à définir un panneau dans lequel on dit que le noeud 
548      sélectionné n'est pas actif
549   """
550   def __init__(self,parent,panneau,node) :
551       self.parent=parent
552       self.panneau = panneau
553       self.node=node
554       Frame.__init__(self,self.panneau)
555       self.place(x=0,y=0,relheight=1,relwidth=1)
556       self.creer_texte()
557
558   def creer_texte(self):
559       texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
560       texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
561       longueur = int(self.panneau.winfo_width()*0.8)
562       self.label = Label(self,text=texte,wraplength=longueur,justify='center')
563       self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
564       self.bouton_sup = Button(self,
565                                text = "Supprimer",
566                                command=self.supprimer,
567                                width=14)
568       self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
569
570
571 if __name__ == "__main__" : pass