supprimer un element !

supprimer un element ! - Python - Programmation

Marsh Posté le 05-06-2004 à 19:46:42    

Bonjour,  
 
dans le cadre de mes etudes en IUT infi a la rochelle, nous avons a elaborer un projet en Python + Glade , seulement k'ai un problème, une structure nous a été fournie par le professeur pour faciliter la partie Base de Données mais j'ai un problème avec celle çi.
E, fait je peut ajouter des eleves mais lorsque je souhaite en supprimer un j'ai le droit à  cette erreur :
 

Code :
  1. Traceback (most recent call last):
  2.   File "inscription.py", line 172, in on_Valider_clicked
  3.     self.controleur.suppression()
  4.   File "inscription.py", line 66, in suppression
  5.     self.supprimerEleve(self.fenetreSuppr.saisieIdent.get_text())
  6.   File "inscription.py", line 122, in supprimerEleve
  7.     lib.remove(EleveAVirer)
  8.   File "lib.py", line 137, in remove
  9.     raise 'panic : object "%s" can not be removed' % repr(obj)
  10. panic : object "('Jonathan Blanchet', '01/10/1985', '0251976039', '24 rue de Gaulle', 'jblanche')" can not be removed


Voila maintenant le code :  
Structures fournies :
entites.py :  

Code :
  1. import lib
  2. class Eleve(lib.Entity) :
  3. def __init__(self, ident ,  nom, date, tel, adr) :
  4.  lib.Entity.__init__(self)
  5.  self.ident = ident
  6.  self.nom = nom
  7.  self.date = date
  8.  self.tel = tel
  9.  self.adr = adr


 
 
lib.py :  

Code :
  1. # -*- coding: latin-1 -*-
  2. # Cette version de lib est prévue pour python 2.3
  3. # et gtk 2
  4. # Mini bibliothèque pour de petits prototypes dans le style de OOSE.
  5. # -----------------------------------------------------------------
  6. #
  7. # G.Louis - I.U.T. de La Rochelle - 2002, 2003, 2004
  8. #
  9. # (C) G. LOUIS - 2002, 2003, 2004
  10. #
  11. # Cette bibliothèque fournit des objets persistents pour les entités UML
  12. # (entités au sens de OOSE de Jacobson).
  13. # Cette bibliothèque fournit une super-classe pour les controleurs et les interfaces
  14. # au sens de OOSE.
  15. # Les fenêtres sont définies par glade, et implantées par libglade.
  16. # La connexion automatique des "handlers" aux "signals" est assurée.
  17. #
  18. # PERSISTENCE
  19. # -----------
  20. # Il faut initialiser la connexion à la "base de données" par
  21. #  lib.connect(<nom-du-fichier> ).
  22. #
  23. # A la fin du programme, il faut fermer la connexion par lib.commit() pour
  24. # assurer la persistence.
  25. #
  26. # Toutes les classes qui correspondent à des entités doivent :
  27. #  1. Etre des sous classes de Entity
  28. #  2. Invoquer le constructeur de cette classe : lib.Entity.__init__(self)
  29. #
  30. # Toutes les entités ont un "oid" accessible par l'attribut _oid, qu'il ne faut
  31. # évidemment jamais modifier.
  32. #
  33. # lib.instances(P) fournit la liste des instances de la classe P (à condition qu'il
  34. # s'agisse bien d'une classe qui respecte les règles ci-dessus).
  35. #
  36. # lib.remove(p) supprime l'objet persistent p de la base de données proprement dite.
  37. # p n'est plus accessible grâce à lib.instances(P) (où P est la classe de P), mais
  38. # peut rester accessible à partir d'autres objets persistents. Une exception est levée
  39. # si l'objet n'est pas dans la base.
  40. #
  41. #
  42. # CONTROLEURS.
  43. # -----------
  44. #
  45. # Les sous-classes de Controller doivent appeler le constructeur de la classe :
  46. #  lib.Controller.__init__(self, <nom du fichier glade> )
  47. #
  48. # Le controleur possède un attribut pour chaque Interface qui a été construite
  49. # pour lui (qui lui a été attachée). Voir ci-dessous, la documentation des Interfaces.
  50. #
  51. #
  52. # INTERFACES.
  53. # ----------
  54. #
  55. # Les sous-classes de Interface doivent appeler le constructeur de la classe :
  56. #  lib.Interface.__init__(self, nom_fenetre, contrôleur)
  57. # où nom_fenetre est le nom de la fenêtre, tel qu'on l'a fixé dans glade.
  58. #
  59. # Donc, chaque Interface (plus précisément chaque instance d'une sous-classe d'interface)
  60. # correspond à une fenêtre créée avec glade.
  61. #
  62. # Pour chacun des widgets de la fenêtre -- y compris la fenêtre elle même -- l'interface
  63. # possède un attribut. Le nom de cet attribut est le nom du widget dans glade. La
  64. # valeur de cet attribut est un objet gtk, auquel on peut envoyer les messages
  65. # définis par le module gtk.
  66. #
  67. # Une interface doit posséder une méthode pour chaque "signal handler" défini par glade,
  68. # pour sa fenêtre et pour les widgets que contient cette fenêtre. Par exemple
  69. #  def on_accept-clicked(self, widget) : ...
  70. # Toutefois, en l'absence de cette méthode, on connecte un "handler" par défaut,
  71. # qui imprime un message de rappel. Ceci permet un dévelopement incrémental du code.
  72. #
  73. # Chaque interface est "attachée" au controleur pour lequel elle a été construite.
  74. # L'interface possède l'attribut "controleur", pour enregistrer ce controleur.
  75. # A son tour, le contrôleur possédera un attribut qui porte le nom de la fenêtre glade
  76. # et qui enregistre l'interface créée pour cette fenêtre.
  77. #
  78. # Donc, si un controleur doit faire apparaître la fenêtre win2 à l'écran, on écrira :
  79. #  self.win2.win2.show()
  80. # dans une méthode du contrôleur. Car dans le contrôleur, self.win2 désigne l'interface
  81. # attachée au contrôleur pour gérer la fenêtre win2. Dans cette interface, win2 désigne
  82. # l'objet fenêtre gtk lui-même.
  83. #
  84. import pickle
  85. import os
  86. __trace__ = 4
  87. __DBRoot__ = None
  88. def connect(filePath) :
  89. global __DBRoot__, __filePath__, statusMsg
  90. __filePath__ = filePath
  91. if os.path.isfile(filePath) and os.access(filePath, os.R_OK) :
  92.  file = open(filePath)
  93.  __DBRoot__ = pickle.load(file)
  94.  file.close()
  95.  statusMsg = "existing database %s open." % filePath
  96. else : # file will be opened for writing by "commit"
  97.  __DBRoot__ = { }
  98.  statusMsg = "new database %s open." % filePath
  99. def commit() :
  100. if __DBRoot__ == None :
  101.  raise "panic : no file opened"
  102. file = open(__filePath__, "w" )
  103. pickle.dump(__DBRoot__, file)
  104. file.close()
  105. statusMsg = "database %s committed." % __filePath__
  106. class Entity :
  107. # Les sous-classes d'entity DOIVENT appeler Entity.__init__(self)
  108.    def __init__(self) :
  109.    # A database must be open
  110.       if __DBRoot__ == None :
  111.          raise "panic : no database opened."
  112.       k = self.__class__.__name__
  113.       if not __DBRoot__.has_key(k) : __DBRoot__[k] = [ 0 ]
  114.       self._oid = k + "#" + repr(__DBRoot__[k][0])
  115.       __DBRoot__[k][0] = __DBRoot__[k][0] + 1
  116.       __DBRoot__[k].append(self)
  117. def instances(_class) : # méthode qui rend la liste des instances
  118.    if __DBRoot__.has_key(_class.__name__) :
  119.       return __DBRoot__[_class.__name__][1:]
  120.    else :
  121.       return [ ] # no instances yet or user error ?
  122. def remove(obj) :
  123.    if __DBRoot__.has_key(obj.__class__.__name__) \
  124.          and obj in __DBRoot__[obj.__class__.__name__] :
  125.       __DBRoot__[obj.__class__.__name__].remove(obj)
  126.    elif __DBRoot__.has_key(obj.__class__.__name__) :
  127.       raise 'panic : object with oid "%s" can not be found to be removed' % obj._oid
  128.    else :
  129.       raise 'panic : object "%s" can not be removed' % repr(obj)
  130. #
  131. # CONTROLEURS.
  132. # -----------
  133. #
  134. import xml.parsers.expat
  135. # Constants for the states on the stack for the SAX parser.
  136. neutral = "neutral"
  137. window = "window"
  138. # The stack items are 3-uples.
  139. # The first element of these tuples are one of the constants above. 
  140. # The second element is a dictionnary where widgets should be added
  141. # The third element is a dictionary where signals should be added
  142. # (or None, if no window has been encounered, yet)
  143. # (See below, the structure of sig_dico)
  144. class DefaultHandler : # A default handler that prints a warning message
  145.    def __init__(self, win_name, handler_name) :
  146.       self.win_name = win_name
  147.       self.handler_name = handler_name
  148.    def handler(self, widget, * rest) :
  149.       print "WARNING : %s should define handler %s(self, widget)."\
  150.                                            % (self.win_name, self.handler_name)
  151. class Controller :
  152.    def __init__(self, gladefilename) :
  153.       self.gladefilename = gladefilename
  154.       ifile = open(gladefilename)
  155.       # sig_dico is a 3 level deep tree of dictionaries
  156.       # The first level associates each window name to a dictionary, which
  157.       # at the second level associates each widget name to a dictionary which
  158.       # at the third level associates each signal name to a handler name.
  159.       # See also method "tree" above.
  160.       self.sig_dico = { }
  161.       # stack of states to handle elements'nesting
  162.       self.states = [ ] ; self.states.append( (neutral, self.sig_dico, None) )
  163.       p = xml.parsers.expat.ParserCreate("ISO-8859-1" ) # "ISO-8859-1" ?
  164.       p.StartElementHandler = self.start_element
  165.       p.EndElementHandler = self.end_element
  166.       # p.CharacterDataHandler = self.char_data
  167.       p.ParseFile(ifile)
  168.       ifile.close()
  169.       if __trace__ >= 3 : self.tree()
  170.       # Dynamic attributes for windows. Will get an interface on attachment.
  171.       for w in self.sig_dico.keys() :
  172.          self.__dict__[w] = None # Dynamic attr definition
  173.    def tree(self) : # trace of the tree in self.sig_dico
  174.       for win in self.sig_dico.keys() :
  175.          print "Window", win
  176.          for wid in self.sig_dico[win].keys() :
  177.             print "   Widget", wid
  178.             for s in self.sig_dico[win][wid].keys() :
  179.                print "      Signal", s, "-> method", self.sig_dico[win][wid][s]
  180.    def start_element(self, xml_elt, attrs) :
  181.       if __trace__ >= 5 : print 'Start element:', xml_elt, attrs
  182.       state, widgets, signals = self.states[ -1 ]
  183.       if state == neutral and xml_elt == u"widget" :
  184.          if attrs[u"class"] == u"GtkWindow" :
  185.             winName = attrs[u"id"].encode()
  186.             widgets[winName] = { } # For the widgets
  187.             widgets[winName][winName] = { } # For the signals of the window itself
  188.             self.states.append( (window, widgets[winName], widgets[winName][winName]) )
  189.             if __trace__ >= 4 : print "push :", repr(xml_elt), repr(attrs[u"id"]), len(self.states)
  190.          else :
  191.             raise "Panic : Non-window widget %s at top-level of glade file" \
  192.                   % (attrs[u"id"].encode() , )
  193.       elif state == window and xml_elt == u"widget" :
  194.          widName = attrs[u"id"].encode()
  195.          if widName in widgets.keys() :
  196.             print " *** Panic : 2 widgets nommés <<%s>> dans la fenetre" % ( widName, )
  197.             import sys
  198.             sys.exit(1)
  199.          widgets[widName] = { } # For the signals of the widget
  200.          self.states.append( (window, widgets, widgets[widName]) )
  201.          if __trace__ >= 4 : print "push :", repr(xml_elt), repr(attrs[u"id"]), len(self.states)
  202.       elif state == window and xml_elt == u"signal" :
  203.          signals[ attrs[u"name"].encode() ] = attrs[u"handler"].encode()
  204.       if __trace__ >= 5 : print " >state :", self.states[-1]
  205.    def end_element(self, xml_elt) :
  206.       if __trace__ >= 5 : print "End element", repr(xml_elt)
  207.       if xml_elt == u"widget" :
  208.          self.states.pop()
  209.          if __trace__ >= 4 : print "pop :", repr(xml_elt), len(self.states)
  210.       if __trace__ >= 5 :
  211.          if len(self.states) > 0 :
  212.             print " < state :", self.states[-1]
  213.          else :
  214.             print " ** Stack empty."
  215.    def attach(self, itrf, win_name, glade_win) :
  216.       # self.tree()
  217.       # print self.sig_dico.keys()
  218.       if __trace__ >= 2 : print "Attaching :", win_name
  219.       if not self.sig_dico.has_key(win_name) :
  220.          raise "panic : controller has no %s window (%s)." \
  221.                                  % (win_name, repr(self.sig_dico.keys()))
  222.       win_dico = self.sig_dico[win_name]
  223.       self.__dict__[win_name] = itrf # Dynamic attr definition
  224.       for widget in win_dico.keys() :
  225.          if __trace__ >= 2 : print "   Defining :", widget
  226.          itrf.__dict__[widget] = glade_win.get_widget(widget) # Again
  227.          h_dico = win_dico[widget]
  228.          for signal_name in h_dico.keys() :
  229.             handler_name = h_dico[signal_name]
  230.             if __trace__ >= 2 : print "      handler for", signal_name, "is", handler_name,
  231.             if hasattr(itrf, handler_name) :
  232.                method = eval("itrf." + handler_name)
  233.                if __trace__ >= 2 : print ". It was connected."
  234.             else :
  235.                method = DefaultHandler(win_name, handler_name).handler
  236.                if __trace__ >= 2 : print ". A dummy handler was created."             
  237.             # print handler_name, '->', method
  238.             glade_win.signal_connect(handler_name, method)
  239. #
  240. # INTERFACES.
  241. # ----------
  242. #
  243. import gtk
  244. import gtk.glade
  245. class Interface :
  246.    def __init__(self, window_name, controleur) :
  247.       self.controleur = controleur
  248.       self.glade_win = gtk.glade.XML(controleur.gladefilename, window_name)
  249.       controleur.attach(self, window_name, self.glade_win)
  250.       # print dir(self)
  251.    def gtk_main_quit(self, widget) :
  252.       if __trace__ >= 3 : print "Std gtk_main_quit was called."
  253.       gtk.mainquit()


De nous :  
inscription.py

Code :
  1. import lib
  2. import gtk
  3. import entites
  4. class Controleur(lib.Controller):
  5. def __init__(self):
  6.  lib.Controller.__init__(self, "ecole_de_music.glade" )
  7.  self.execute()
  8. def execute(self):
  9.  lib.connect("bdEleves" )
  10.  self.fenetreMenu = ItrfMenu(self)
  11.  gtk.mainloop()
  12.  lib.commit()
  13.  print "Bye..."
  14. def afficherErreur(self, typeErreur, champVide):
  15.  self.uneErreur  = ItrfErreur(self,typeErreur, champVide)
  16. def fermerErreur(self):
  17.  self.erreur.erreur.hide()
  18. def verifierChamps(self):
  19.  global typeErreur
  20.  global champVide
  21.  if (self.fenetreInscription.entry1.get_text() == "" ) :
  22.   typeErreur = "Veuillez remplir le champ : "
  23.   champVide = "Nom et prenom"
  24.   self.afficherErreur(typeErreur, champVide)
  25.  elif (self.fenetreInscription.entry2.get_text() == "" ):
  26.   typeErreur = "Veuillez remplir le champ : "
  27.   champVide = "Date de naissance"
  28.   self.afficherErreur(typeErreur, champVide)
  29.  elif (self.fenetreInscription.entry3.get_text() == "" ):
  30.   typeErreur = "Veuillez remplir le champ : "
  31.   champVide = "Numero de telephone"
  32.   self.afficherErreur(typeErreur, champVide)
  33.  elif (self.fenetreInscription.entry4.get_text() == "" ):
  34.   typeErreur = "Veuillez remplir le champ : "
  35.   champVide = "Adresse"
  36.   self.afficherErreur(typeErreur, champVide)
  37.  elif (self.fenetreInscription.entry5.get_text() == "" ):
  38.   typeErreur = "Veuillez remplir le champ : "
  39.   champVide = "Identifiant"
  40.   self.afficherErreur(typeErreur, champVide)
  41.  else :
  42.   print("Ca marche" )
  43.   self.ajouterEleve(self.fenetreInscription.entry1.get_text(),\
  44.      self.fenetreInscription.entry2.get_text(),\
  45.      self.fenetreInscription.entry3.get_text(),\
  46.      self.fenetreInscription.entry4.get_text(),\
  47.      self.fenetreInscription.entry5.get_text())
  48. def suppression(self) :
  49.  if(self.fenetreSuppr.saisieIdent.get_text() == "" ) :
  50.   typeErreur = "Veuillez remplir le champ : "
  51.   champVide = "Identifiant"
  52.   self.afficherErreur(typeErreur, champVide)
  53.  else :
  54.   self.supprimerEleve(self.fenetreSuppr.saisieIdent.get_text())
  55. def retourMenu(self, str):
  56.  if (str == "suppr" ):
  57.   self.fenetreSuppr.fenetreSuppr.hide()
  58.  elif (str == "insc" ) :
  59.   self.fenetreInscription.fenetreInscription.hide()
  60.  elif (str == "modif" ) :
  61.   self.fenetreModif.fenetreModif.hide()
  62.  self.menu.menu.show()
  63. def ajout(self):
  64.  self.fenetreInscription = ItrfInscription(self)
  65. def modif(self):
  66.  self.fenetreModif = ItrfModif(self)
  67. def suppr(self):
  68.  self.fenetreSuppr = ItrfSuppr(self)
  69. def ajouterEleve(self, nom, date, tel, adr, ident):
  70.  Eleves = map(lambda e : e.ident, lib.instances(entites.Eleve))
  71.  if ident in Eleves :
  72.   typeErreur = "L'identifiant "+ident
  73.   champVide = "existe deja"
  74.   self.afficherErreur(typeErreur, champVide)
  75.   self.fenetreInscription.entry5.set_text("" )
  76.  else :
  77.   entites.Eleve(nom, date, tel, adr, ident)
  78.   typeErreur = "L'identifiant "+ident
  79.   champVide = "a ete ajoute."
  80.   self.afficherErreur(typeErreur, champVide)
  81.   self.fenetreInscription.entry1.set_text("" )
  82.   self.fenetreInscription.entry2.set_text("" )
  83.   self.fenetreInscription.entry3.set_text("" )
  84.   self.fenetreInscription.entry4.set_text("" )
  85.   self.fenetreInscription.entry5.set_text("" )
  86. def supprimerEleve(self , identifiant ):
  87.  Eleves = map(lambda e : [e.nom, e.date ,e.tel ,e.adr, e.ident], lib.instances(entites.Eleve))
  88.  print Eleves
  89.  i = 0
  90.  a=0
  91.  while i < len(Eleves):
  92.   idEleve = Eleves[i]
  93.   identElevASupr = idEleve [4]
  94.   if (identElevASupr == identifiant ):
  95.    print "je rentre dans le while"
  96.    nomElevASupr   = idEleve [0]
  97.    dateElevASupr  = idEleve [1]
  98.    telElevASupr   = idEleve [2]
  99.    adrElevASupr   = idEleve [3]
  100.    identElevASupr = idEleve [4]
  101.    EleveAVirer = (nomElevASupr,dateElevASupr,telElevASupr,adrElevASupr,identElevASupr)
  102.    lib.remove(EleveAVirer)
  103.    typeErreur = "L'identifiant : " + identifiant
  104.    champVide = "a ete supprime "
  105.    self.afficherErreur(typeErreur, champVide)
  106.    a=1
  107.   i+=1
  108.  if a == 0 :
  109.   typeErreur = "L'identifiant : " + identifiant
  110.   champVide = "n'existe pas "
  111.   self.afficherErreur(typeErreur, champVide)
  112. class ItrfMenu(lib.Interface):
  113. def __init__(self, ctrl):
  114.  lib.Interface.__init__(self, "menu", ctrl)
  115. def on_Ajout_clicked(self, widget):
  116.  self.controleur.ajout()
  117. def on_Modif_clicked(self, widget):
  118.  self.controleur.modif()
  119. def on_Suppr_clicked(self, widget):
  120.  self.controleur.suppr()
  121. class ItrfInscription(lib.Interface):
  122. def __init__(self, ctrl):
  123.  lib.Interface.__init__(self, "fenetreInscription", ctrl)
  124. def boutonValider_clicked(self, widget):
  125.  self.controleur.verifierChamps()
  126. def boutonPrecedent_clicked(self, widget):
  127.  self.controleur.retourMenu("insc" )
  128. def fenetreInscriptionDestroy(self, widget) :
  129.  gtk.mainquit()
  130. class ItrfModif(lib.Interface):
  131. def __init__(self, ctrl):
  132.  lib.Interface.__init__(self, "fenetreModif", ctrl)
  133. class ItrfSuppr(lib.Interface):
  134. def __init__(self, ctrl):
  135.  lib.Interface.__init__(self, "fenetreSuppr", ctrl)
  136. def on_Valider_clicked(self, widget):
  137.  self.controleur.suppression()
  138. def on_Precedent_clicked(self, widget):
  139.  self.controleur.retourMenu("suppr" )
  140. def fenetreInscriptionDestroy(self, widget) :
  141.  gtk.mainquit()
  142. class ItrfErreur(lib.Interface):
  143. def __init__(self, ctrl, typeErreur, champVide):
  144.  lib.Interface.__init__(self, "erreur", ctrl)
  145.  self.typeErreur.set_text(typeErreur)
  146.  self.champVide.set_text(champVide)
  147. def fermerErreurClicked(self, widget):
  148.  self.controleur.fermerErreur()
  149. def fenetreErreurDestroy(self) :
  150.  self.controleur.fermerErreur()
  151. Controleur()


 
Mon problème : Dans la fonction supprimerEleve je recrée l'élève mais pas comme il faut apparement le type de l'objet ne correspond pas c'est ça non ?
 
Voila je compte sur vous pour regler ce problème et m'aider a poursuivre mon apprentissage Merci !


Message édité par john8585 le 05-06-2004 à 20:00:28
Reply

Marsh Posté le 05-06-2004 à 19:46:42   

Reply

Marsh Posté le 05-06-2004 à 21:53:11    

UP

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed