Eval de variables dans une fonction

Eval de variables dans une fonction - Python - Programmation

Marsh Posté le 06-05-2007 à 16:44:48    

J'ai un GUI en wxpython, mais le problème que j'ai se situe plutôt dans la partie python.  
Le GUI se compose de 6 images StaticBitmap que j'appelle button1...button6. Je voudrais, à l'aide des flêches du clavier, me déplacer sur ces boutons.A chaque fois que je suis sur un bouton, il change d'image. En fait, j'utilise la fonction:  
buttonoff.SetBitmap(imageoff) pour le faire changer d'image. J'initialise la variable self.pos à 0 avant d'appeler la fonction par:
 

Code :
  1. self.Bind(wx.EVT_CHAR, self.OnOffButton)


Pour les déplacements, j'ai écrit la fonction:  

Code :
  1. def OnOffButton(self, event):
  2.         image_off=['image1', 'image2', 'image3', 'image4', 'image5', 'image6']
  3.         imageleave=image_off[self.pos]
  4.         buttonleave='button' + str(self.pos + 1)
  5.         key = event.GetKeyCode()
  6.         if key in (wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, wx.WXK_DOWN):
  7.             if key == wx.WXK_LEFT:
  8.                 print "LEFT"
  9.                 if self.pos > 2:
  10.                     self.pos = self.pos - 3
  11.             elif key == wx.WXK_RIGHT:
  12.                 print "RIGHT"
  13.                 if self.pos < 3:
  14.                     self.pos = self.pos + 3
  15.             elif key == wx.WXK_UP:
  16.                 print "UP"
  17.                 if self.pos == 3:
  18.                     self.pos = self.pos
  19.                 elif self.pos == 0:
  20.                     self.pos = self.pos
  21.                 else:
  22.                     self.pos = self.pos - 1
  23.             elif key == wx.WXK_DOWN:
  24.                 print "DOWN"
  25.                 if self.pos == 2:
  26.                     self.pos = self.pos
  27.                 elif self.pos == 5:
  28.                     self.pos = self.pos
  29.                 else:
  30.                     self.pos = self.pos + 1
  31.         if key == wx.WXK_ESCAPE:
  32.             self.OnTimeToClose()
  33.         buttonenter='button' + str(self.pos + 1)
  34.         imageenter=image_off[self.pos] + '_on'
  35.         buttonleave.SetBitmap(imageleave)
  36.         buttonenter.SetBitmap(imageenter)
  37.         buttonleave.Refresh()
  38.         buttonleave.Update()
  39.         buttonenter.Refresh()
  40.         buttonenter.Update()
  41.         event.Skip()
  42.         return


 
mais quand je joue le script, j'ai le message d'erreur:

Citation :

AttributeError: 'str' object has no attribute 'SetBitmap'


C'est comme s'il n'évaluait pas les variables buttonleave, etc ....
Quelqu'un aurait une idée ???


Message édité par usf70 le 06-05-2007 à 16:57:45
Reply

Marsh Posté le 06-05-2007 à 16:44:48   

Reply

Marsh Posté le 06-05-2007 à 20:27:43    

forcément c'est une str ton truc ... utilise une list et jète ta numérotation de noms de variables.

Reply

Marsh Posté le 07-05-2007 à 00:48:12    

Comment ça une list ?? Pourrais-tu m'en dire plus ?


Message édité par usf70 le 07-05-2007 à 00:48:34
Reply

Marsh Posté le 07-05-2007 à 10:44:06    

Une solution à mon problème:

Code :
  1. buttonleave=eval('button' + str(self.pos + 1))


en remplaçant mes variables avec des eval, ça marche ... Par contre, je serai interessé par ta solution avec les list Taz si tu pouvais m'en dire plus ....

Message cité 1 fois
Message édité par usf70 le 07-05-2007 à 10:44:29
Reply

Marsh Posté le 07-05-2007 à 10:48:30    

en 5 ans de python, je n'ai JAMAIS utilisé eval.  
 
Tes boutons, ils sont ou ? bah tu les mets dans une list et voilà

Reply

Marsh Posté le 07-05-2007 à 10:53:47    

usf70 a écrit :

Une solution à mon problème:

Code :
  1. buttonleave=eval('button' + str(self.pos + 1))


en remplaçant mes variables avec des eval, ça marche ... Par contre, je serai interessé par ta solution avec les list Taz si tu pouvais m'en dire plus ....


NE JAMAIS UTILISER EVAL
 
Je ne connais aucun langage ou l'utilisation explicite d' `eval` soit nécessaire, à part peut-être PHP, et encore.
 

  • Eval a des performances pitoyables, parce qu'il doit refaire tout un parsing de l'expression au runtime au lieu de le faire au parsing initial du fichier
  • Eval peut avoir des effets de bord critiques
  • Eval peut être fait sur des données venant -- même de façon détournée -- de l'utilisateur, et constitue en ce cas une faille de sécurité majeure.


Et pour la (parfaite) solution que propose Taz, suffit d'aller lire la doc... http://docs.python.org/tut/node5.h [...] 0000000000


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-05-2007 à 18:45:34    

OK, Merci de vos conseils ... je vais regarder ça de plus près...

Reply

Sujets relatifs:

Leave a Replay

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