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