Partage
  • Partager sur Facebook
  • Partager sur Twitter

"NameError : name is not defined" alors que si

Sujet résolu
    13 février 2016 à 5:24:35

    Bonjour,

    Ce problème commence sérieusement à me casser la tête, d'autant que je suis certain que la solution est simplissime. Je vous met le code :

    # !/usr/bin/python
    # -*- coding: utf8 -*-
    
    import wx
    import fonctions
    
    
    """
    --------------------------------------------------------------------------------
    Liste des => BANQUES <= + formulaire d'ajout
    --------------------------------------------------------------------------------
    """
    
    class PanneauxBanques:
        panelListe = wx.Panel(fenetre)
        panelAjout = wx.Panel(fenetre)
        
        sizerGlobal = wx.GridBagSizer()
        sizerListe = wx.GridBagSizer()
        sizerAjout = wx.GridBagSizer()
        
        # Construction : liste des banques
        # liste_banques()
        
        # Construction : ajout d'une banque
        intituleAjout = wx.StaticText(panelAjout,-1,u"Ajouter une banque")
        sizerAjout.Add(intituleAjout,(0,0),(2,1))
        
        labelIntitule = wx.StaticText(panelAjout,-1,u"Intitulé :")
        sizerAjout.Add(labelIntitule,(1,0),(1,1))
        champIntitule = wx.TextCtrl(panelAjout,-1)
        sizerAjout.Add(champIntitule,(1,1),(1,1))
        
        labelCodeBanque = wx.StaticText(panelAjout,-1,u"Code banque :")
        sizerAjout.Add(labelCodeBanque,(2,0),(1,1))
        champCodeBanque = wx.TextCtrl(panelAjout,-1)
        sizerAjout.Add(champCodeBanque,(2,1),(1,1))
        
        labelCodeGuichet = wx.StaticText(panelAjout,-1,u"Code guichet :")
        sizerAjout.Add(labelCodeGuichet,(3,0),(1,1))
        champCodeGuichet = wx.TextCtrl(panelAjout,-1)
        sizerAjout.Add(champCodeGuichet,(3,1),(1,1))
        
        boutonAjout = wx.Button(panelAjout,-1,label=u"Ajouter")
        sizerAjout.Add(boutonAjout,(4,0),(2,1))
        
        panelListe.SetSizer(sizerListe)
        panelAjout.SetSizer(sizerAjout)
        
        sizerGlobal.Add(panelListe,(0,0),(1,1))
        sizerGlobal.Add(panelAjout,(0,1),(1,1))
        
        fenetre.SetSizer(sizerGlobal)
        
        def OnChoix(self,e):
            # frame.panneau = PanneauComptes()
            print("Salut")
            
        def OnAjout(self,e):
            # ajout_banque()
            print("Salut")
            
        def OnSuppr(self,e):
            # suppr_banque()
            print("Salut")
    
    
    """
    --------------------------------------------------------------------------------
    => FENETRE <= du programme
    --------------------------------------------------------------------------------
    """
    
    
    class Fenetre(wx.Frame):
        def __init__(self,parent,id,title):
            wx.Frame.__init__(self,parent,id,title)
            
            barreMenu = wx.MenuBar()
    
            menuFichier = wx.Menu()
            aPropos = menuFichier.Append(wx.ID_ABOUT,u"À propos",u"Informations relatives au programme")
            menuFichier.AppendSeparator()
            quitter = menuFichier.Append(wx.ID_EXIT,u"Quitter",u"Mettre fin au programme")
    
            barreMenu.Append(menuFichier,u"Fichier")
    
            self.SetMenuBar(barreMenu)
            
            self.CreateStatusBar()
            
            self.Bind(wx.EVT_MENU,self.OnAPropos,aPropos)
            self.Bind(wx.EVT_MENU,self.OnQuitter,quitter)
            
            self.Show()
        
        def initialize(self):
            self.panel = PanneauxBanques()
            
        def OnAPropos(self,e):
            pass
    
        def OnQuitter(self,e):
            self.Close()
    
            
    # Lancement du programme
    
    application = wx.App()
    fenetre = Fenetre(None,-1,"Tests")
    fenetre.initialize
    application.MainLoop()

    Au lancement de ce code j'ai un merveilleux "NameError: name 'fenetre' is not defined", le programme bloquant à la ligne "panelListe = wx.Panel(fenetre)" (fenetre étant le parent de panelListe), au tout début de la classe PanneauxBanques. Je ne vois vraiment pas le soucis, d'autant que l'instanciation de "fenetre" est faite à la fin.

    Merci par avance pour votre aide.

    -
    Edité par dephdre 13 février 2016 à 5:54:38

    • Partager sur Facebook
    • Partager sur Twitter
      13 février 2016 à 10:21:49

      C'est tout à fait normal, ta classe n'a aucune connaissance des variables qui lui sont extérieures à moins que tu ne les lui passes en arguments.
      • Partager sur Facebook
      • Partager sur Twitter
        13 février 2016 à 10:34:14

        Kynarth a écrit:

        C'est tout à fait normal, ta classe n'a aucune connaissance des variables qui lui sont extérieures à moins que tu ne les lui passes en arguments.

        Le problème n'est pas là. Les scopes dynamiques de Python font qu'il est parfaitement possible de référencer une variable définie à l'extérieur.

        Dans son cas, ce qui coince est que la ligne 15 est évaluée avant la 110, et donc que fenetre n'est pas définie. Une solution serait de créer une méthode __init__ dans la classe PanneauxBanques, et de ne l'appeler qu'une fois fenetre définie. Mais tu pourrais aussi en profiter pour passer fenetre en paramètre lors de la construction de PanneauxBanques.

        Au passage, pourquoi une méthode initialize ? __init__ est déjà là pour faire le boulot. En plus, ta méthode initialize` n'est jamais appelée (regarde bien la ligne 111).

        • Partager sur Facebook
        • Partager sur Twitter
          13 février 2016 à 18:18:35

          Merci entwanne pour ta réponse. J'ai effectivement codé le constructeur de la classe PanneauxBanques et j'ai fait sauter la méthode initialize de la classe Fenetre (j'ai du vouloir la mettre pour l'utiliser après l'instanciation de "fenetre", mais bon c'est tordu - je suis pas encore parfaitement au point niveau compréhension des mécanismes). Au final tout est séparé et propre, donc je peux finalement créer une instance de la classe Fenetre pour ensuite en créer une de PanneauxBanques. Ça roule bien mieux, encore merci :)

          -
          Edité par dephdre 13 février 2016 à 18:20:12

          • Partager sur Facebook
          • Partager sur Twitter

          "NameError : name is not defined" alors que si

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown