Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Membre régulier
    Inscrit en
    décembre 2007
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 107
    Points : 70
    Points
    70

    Par défaut éclaircissement sur des parties de code

    Bonjour ,

    Je bute sur deux problème concernant mon code. Le code en soit marche bien mais il y'a deux chose que je n'arrive pas a comprendre.

    j'ai deux classes un classe MainApp et une MenuMap qui gère l'affichage de bouton pour MainApp. Toute mes variable son dans MainApp.

    La première chose que je ne comprends pas c'est le refus d'une fonction de m'afficher un message en fin de code.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def Open_file(self):
            print 'fct Open_file lance : '
            self.image = tkFileDialog.askopenfile(parent=self,mode='rb',title='Choose a file')
            self.image = Image.open(self.image)
            self.mapWidth, self.mapHeight =self.image.size
            self.can.config(scrollregion=(0,0,self.mapWidth, self.mapHeight))
            #self.can.delete(ALL)
            #print '**fct Afficher_GRILLE lance **'
            self.Afficher_MAP()
            #print '**fct Afficher_GRILLE lance **'
    Code :
    1
    2
    3
    4
    5
    6
    7
     
    def Afficher_MAP(self):
            print '**fct Afficher_MAP lance : **'
            photo= ImageTk.PhotoImage(self.image)
            self.item= self.can.create_image(0,0,anchor=NW,image=photo)
            self.item.pack()
            print '**fct Afficher_MAP termine **'
    print '**fct Afficher_MAP termine **' refuse de se lancer et je ne comprend pas pourquoi. Je pense que ça vient de self.item.pack attributte error:'int' object has no atribute 'pack' mais je ne comprends pas l'erreur exactement.



    La deuxième question porte sur la façon de coder.

    Dans MenuMap, j'ai instancié une case a cocher.

    Code :
    1
    2
    3
    4
     
    #  grille  #
            parent.affGrille=IntVar(value=0)
            Checkbutton(self, text='grille', variable=parent.affGrille, command= self.test_Grille).grid(row=0,column=1,sticky=W)
    Pour récupérer l'etat de la case je lui est associé un variable de la classe principale mainApp affGrille. Au début j'avais mie la premièreligne dans mainApp mais si je ne le fais pas dans MenuMap ça refuse de se lancer. Y'a t'il une raison a ça? Et de la même manière, je peux tres facilement récupéré l'etat de cette variable coté MainMap, mais si je tente de le faire dans menuMap, j'obtiens se message d'erreur :

    NameError : global name 'parent' is not defined

    J'ai bien essyé de faire un global qui contiendrait parent pour voir, mais le code ne se lance pas si je le fais.

    Code :
    1
    2
    3
    4
     
    def test_Grille(self):
            print 'fct test_Grille lance'
            print 'fct test_Grille lance : '+str(parent.affGrille.get())
    je l'ai pourtant définie a l'initialisation. Quelle est la bonne manière de procéder?

    Code :
    1
    2
    3
    4
    5
    6
    7
     
    class MenuMap(Frame):
     
        ###### CONSTRUCTEUR
        def __init__(self, parent =None):
     
            Frame.__init__(self, parent)
    Pouvez m'éclairer sur ces problème s'il vous plaie, c'est pas que ça gêne mais
    je trouve que ça nuit a la propreté du code.

    Bonne soirée ,

  2. #2
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    Par défaut

    Salut

    print '**fct Afficher_MAP termine **' refuse de se lancer et je ne comprend pas pourquoi. Je pense que ça vient de self.item.pack attributte error:'int' object has no atribute 'pack' mais je ne comprends pas l'erreur exactement.
    Comme les méthodes sont souvent utilisées par l'event loop de Tk, le programme "continue" après l'erreur mais n'exécute pas pour autant les instructions suivantes.

    self.item.pack est inutile car canvas est geometry manager.
    Mais la cause de la cause est que self.can.create_image retourne un entier (et non un Widget) qui peut être utilisé pour identifier l'objet du canvas.

    L'histoire de "parent".
    parent est recherché dans l'espace de nom locals() puis globals().
    Le locals() d'une méthode est initialisé avec les paramètres nommés.
    Dans la construction:
    Code :
    1
    2
    def __init__(self,parent =None):
             Frame.__init__(self, parent)
    parent existe pour Frame.__init__ car créé dans locals() car "paramètre" d'__init__.

    Dans la construction:
    Code :
    1
    2
    3
    def test_Grille(self):
            print 'fct test_Grille lance'
            print 'fct test_Grille lance : '+str(parent.affGrille.get())
    parent n'est pas définit dans locals(), ni dans globals() - sinon cela ne ralerait pas -.

    Les widgets de tk sont composites: tous les widgets ont "parent" et "fils". Mais les variables correspondantes sont "master" et "children" (un dict).
    Essayez pour voir.
    - W
    Architectures Post-Modernes

  3. #3
    Membre régulier
    Inscrit en
    décembre 2007
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 107
    Points : 70
    Points
    70

    Par défaut

    A merci pour les explication

    Pour master ça marche, je met juste le code savoir si vous pouvez mz dire si je l'ai bien utilisé.

    Code :
    1
    2
    3
     
    def test_Grille(self):
            print 'fct test_Grille lance : '+str(self.master.affGrille.get())
    Par contre pour pour pack(), ça m'a révélé que mon code était mauvais en fait du coup. Quand je l'enlève, L'image ne s'affiche plus apres le chargement. Cependant les glissière du canvas se sont bien adapté comme si elle était la.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def Open_file(self):
            print 'fct Open_file lance : '
            self.image = tkFileDialog.askopenfile(parent=self,mode='rb',title='Choose a file')
            self.image = Image.open(self.image)
            self.mapWidth, self.mapHeight =self.image.size
            self.can.config(scrollregion=(0,0,self.mapWidth, self.mapHeight))
            #self.can.delete(ALL)
            #print '**fct Afficher_GRILLE lance **'
            self.Afficher_MAP()
            #print '**fct Afficher_GRILLE lance **'
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    def Afficher_MAP(self):
            print '**fct Afficher_MAP lance : **'
            photo= ImageTk.PhotoImage(self.image)
            self.item= self.can.create_image(0,0,anchor=NW,image=photo)
     
            print '**fct Afficher_MAP termine **'
    Qu'est ce qui peut provoquer ça?

  4. #4
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    Par défaut

    Salut,

    Pour master ça marche, je met juste le code savoir si vous pouvez mz dire si je l'ai bien utilisé.
    Utiliser les objets Tk dans un contexte POO Python est un sujet "compliqué", on le "mieux" sera toujours discutable. Si çà fonctionne, c'est "bien".

    Quand je l'enlève, L'image ne s'affiche plus apres le chargement. Cependant les glissière du canvas se sont bien adapté comme si elle était la.
    Dans la construction:
    Code :
    1
    2
    3
    4
    5
    6
    def Afficher_MAP(self):
            print '**fct Afficher_MAP lance : **'
            photo= ImageTk.PhotoImage(self.image)
            self.item= self.can.create_image(0,0,anchor=NW,image=photo)
     
            print '**fct Afficher_MAP termine **'
    la référence à ImageTk.PhotoImage(self.image) ("photo") disparaît à la sortie de la méthode def Afficher_MAP et le "image=photo" ne garde pas la référence. Et s'il n'y a plus d'image, çà ne peut plus afficher d'image.
    Essayez plutot:
    Code :
    1
    2
    3
    4
    def Afficher_MAP(self):
            print '**fct Afficher_MAP lance : **'
            self.image= ImageTk.PhotoImage(self.image)
            self.item= self.can.create_image(0,0,anchor=NW,image=self.image)
    - W
    Architectures Post-Modernes

  5. #5
    Membre régulier
    Inscrit en
    décembre 2007
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 107
    Points : 70
    Points
    70

    Par défaut

    A d'accord j'ai crue que photo servait juste de centenaire temporaire et que tout la référence a l'image se gardait dans la variable self.image.

    C'est dommage pour Tk, je l'ai choisie en pensant justement que ça serait plus simple pour débuter en poo.

    Merci ça marche très bien.

    Bonne soirée,

  6. #6
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    Par défaut

    Citation Envoyé par pierre-y Voir le message
    C'est dommage pour Tk, je l'ai choisie en pensant justement que ça serait plus simple pour débuter en poo.
    Tk est simple.
    Les implications de l'intégration de Tk dans Python pour la programmation d'application graphiques sont compliquées pour un débutant en POO.
    L'important est d'arriver à faire des programmes qui marchent pour que vous touchiez du doigt les principes de bases. Lorsque vous aurez plus de recul, vous pourrez penser à "mieux".
    - W
    Architectures Post-Modernes

  7. #7
    Membre régulier
    Inscrit en
    décembre 2007
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : décembre 2007
    Messages : 107
    Points : 70
    Points
    70

    Par défaut

    Bonsoir, je tombé sur un problème assez étrange.

    Suite a l'ajout d'un attribut j'ai obtenu se message d'erreur :

    Code :
    1
    2
    3
     
    self.variableTest
    AttributeError: MainApp instance has no attribute 'variableTest'
    Je ne vois pas d’où viens l'erreur. j'ai bien pensé que le problème pouvait venir du fait que la variable n'est pas été initialisé mais j'en ai une autre dans le même cas qui elle ne pose pas de soucis. Est ce que ça vient du fait qu'elle n'est utilisé nul part? Accessoirement, qu'elle est le meilleur endroit dans la classe pour placer les attributs?

    Bonne soirée ,

  8. #8
    Expert Confirmé Sénior
    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 4 748
    Points : 7 160
    Points
    7 160

    Par défaut

    Ajouter un attribut, c'est assigner un objet à la "variable" correspondante.
    Et comme Python est interprété, rien n'empêche d'essayer d'accéder à la "variable" avant qu'elle n'ait été définie.

    Quand le faire?
    Le langage n'impose pas de règles mais il est sage de localiser l'assignation/création dans la construction de l'instance (__new__, __init__).
    Ou de créer par des "variables" de classes avec des valeur par défaut qui seront remplacée par des variables d'instances dès la première assignation.
    - W
    Architectures Post-Modernes

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •