IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

éclaircissement sur des parties de code


Sujet :

Python

  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    761
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 761
    Points : 2 102
    Points
    2 102
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    761
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 761
    Points : 2 102
    Points
    2 102
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    761
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 761
    Points : 2 102
    Points
    2 102
    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 éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    761
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 761
    Points : 2 102
    Points
    2 102
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Votre avis sur des parties de code "triviales"
    Par bstevy dans le forum SQL
    Réponses: 2
    Dernier message: 20/05/2015, 03h35
  2. Réponses: 6
    Dernier message: 22/09/2013, 15h06
  3. Analyse XML impossible sur une partie de code
    Par manuso dans le forum Langage
    Réponses: 10
    Dernier message: 09/11/2009, 18h43
  4. Renseignement sur des parties de script
    Par nico26 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 26/01/2007, 16h04
  5. Réponses: 4
    Dernier message: 04/08/2006, 01h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo