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