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

Tkinter Python Discussion :

Problèmes de classes (je crois)


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut Problèmes de classes (je crois)
    Bonjour ,

    l'exercice du jour consiste donc à créer un visage simplifié.
    Contraintes : il faut créer 2 classes, une pour le "Frame", et une classe Visage()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    from tkinter import*
     
     
    def cercle(can,x,y,r) :
        "permet de dessiner un cercle de centre x,y et de rayon r"
        can.create_oval(x-r,y-r,x+r,y+r)
     
     
     
    class Application(Frame) :
        def __init__(self) :
            Frame.__init__ (self)
            Visage.__init__(self)
     
            self.can = Canvas(self,width=300,height=300,bg='ivory')
            self.can.pack(side=TOP)
     
            Visage()
     
            Button(self,text='Ferme la',command=Visage.bouche_fermer).pack(side=LEFT)
            Button(self,text='Fait AAAAAA',command=Visage.bouche_ouverte).pack(side=RIGHT)
     
     
     
    class Visage(object) :
        "qui dessine des visages simplifiés dans un canevas"
        def __init__(self) :
     
     
            cercle(self.can,150,150,120)    # visage
            cercle(self.can,95,100,25)      # yeux
            cercle(self.can,205,100,25)
            self.bouche = cercle(self.can,150,210,45)
     
     
        def bouche_fermer(self) :
            del self.bouche
            self.bouche = self.can.create_line(100,210,200,210)
     
        def bouche_ouverte(self) :
            del self.bouche
            self.bouche = cercle(self.can,150,210,45)
     
     
    #
    if __name__ == "__main__" :
        ap = Application()
        ap.mainloop()
    le message d'erreur, que je n'arrive pas à régler malgré mes nombreuses tentatives me dit :
    ap = Application()
    File "F:\Python\Exercices\chapitre 13\13 21.py", line 18, in __init__
    Visage.__init__(self)
    File "F:\Python\Exercices\chapitre 13\13 21.py", line 35, in __init__
    cercle(self.can,150,150,120) # visage
    AttributeError: 'Application' object has no attribute 'can'

    Pourtant, j'ai bien un self.can dans l'init.
    Là je sèche. Je ne sais pas pourquoi il me dit qu'il n'y en a pas.
    J'ai bien créé un canevas, j'ai importé VIsage() dans Application(), je l'ai même instancié (je ne sais pas si c'était nécessaire), bref je ne sais pas quoi faire de +

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Application(Frame) :
        def __init__(self) :
            Frame.__init__ (self)
            Visage.__init__(self)
    vous allez appeler Visage.__init__ avec un "self" qui ne contient pas l'attribut "can" (puisqu'il est créé plus loin/tard) d'où l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cercle(self.can,150,150,120) # visage
    AttributeError: 'Application' object has no attribute 'can'
    Et le message d'erreur ne vous dit rien d'autre...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    OK. Je veux bien rajouter des "can" partout...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    from tkinter import*
     
     
    def cercle(can,x,y,r,coul) :
        "permet de dessiner un cercle de centre x,y et de rayon r"
        can.create_oval(x-r,y-r,x+r,y+r,outline=coul,fill=coul)
     
     
     
    class Application(Frame) :
        def __init__(self,can) :
            Frame.__init__ (self)
            Visage.__init__(self,can)
     
     
            self.can = Canvas(self,width=300,height=300,bg='ivory')
            self.can.pack(side=TOP)
     
            Visage()
     
            Button(self,text='Ferme la',command=Visage.bouche_fermer).pack(side=LEFT)
            Button(self,text='Fait AAAAAA',command=Visage.bouche_ouverte).pack(side=RIGHT)
     
            self.pack()
     
    class Visage(object) :
        "qui dessine des visages simplifiés dans un canevas"
        def __init__(self,can) :
     
            cercle(self.can,150,150,120,'pink')    # visage
            cercle(self.can,95,100,25,'blue')      # yeux
            cercle(self.can,205,100,25,'blue')
            self.bouche = cercle(self.can,150,210,45,'red')
     
     
        def bouche_fermer(self) :
            del self.bouche
            self.bouche = self.can.create_line(100,210,200,210,width=10,outline='red')
     
        def bouche_ouverte(self) :
            del self.bouche
            self.bouche = cercle(self.can,150,210,45,'red')
     
     
    #
    if __name__ == "__main__" :
        ap = Application()
        ap.mainloop()
    mais dans ce cas j'ai un problème pour l'exécution. Si je mets :
    J'ai bien évidemment "name can is not defined..."
    je ne sais même pas comment exécuter un script comme celui-ci en fait (si tant est qu'il fonctionne....)

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par RowanMayfair Voir le message
    je ne sais même pas comment exécuter un script comme celui-ci en fait (si tant est qu'il fonctionne....)
    Python non plus! D'ailleurs, il le jette direct avec NameError.
    Après si vous n'avez pas encore compris qu'une séquence d'instructions 1, 2, 3, 4, ... sera exécuté par l'ordinateur dans l'ordre i.e 1, avant 2, 2 avant 3, ...
    Et qu'avec Python, une variable (ou un attribut) n'existe qu'après lui avoir assigné quelque chose,... ben il est urgent de revoir les premiers chapitres de votre tuto. préféré histoire de rafraîchir un peu tout çà.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    et en plus je ne suis pas au bout de mes misères, puisque j'ai copier-coller le script en parallèle pour le mettre dans une seule classe, histoire de vérifier quel problème relevait des classes et ..... je ne sais pas effacer la bouche. Parce qu'elle se trouve dans __init__ je suppose. Il semble qu'il ne soit pas possible d'effacer un dessin initialisé. Et je ne suis pas censée la mettre ailleurs. Enfin si ça doit être possible quand même.....


    Je vais commencer par aller, en effet, feuilleter mon Swinnen pour me remémorer quelques bases

  6. #6
    Membre éclairé Avatar de RowanMayfair
    Femme Profil pro
    Développeuse Freelance
    Inscrit en
    Mars 2019
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 48
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeuse Freelance

    Informations forums :
    Inscription : Mars 2019
    Messages : 247
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    def cercle(can,x,y,r,coul) :
        "permet de dessiner un cercle de centre x,y et de rayon r"
        can.create_oval(x-r,y-r,x+r,y+r,outline=coul,fill=coul)
     
     
     
    class Application(Frame) :
        def __init__(self) :
            Frame.__init__ (self)
     
            self.can = Canvas(self,width=300,height=300,bg='ivory')
            self.can.pack(side=TOP)
     
            Visage.__init__(self,self.can)
     
            Button(self,text='Ferme la',command=Visage.bouche_fermer).pack(side=LEFT)
            Button(self,text='Fait AAAAAA',command=Visage.bouche_ouverte).pack(side=RIGHT)
     
            self.pack()
     
    class Visage(object) :
        "qui dessine des visages simplifiés dans un canevas"
        def __init__(self,canne) :
            self.canne = canne
     
            cercle(canne,150,150,120,'pink')    # visage
            cercle(canne,95,100,25,'blue')      # yeux
            cercle(canne,205,100,25,'blue')
            self.bouche = cercle(canne,150,210,45,'red')
     
     
        def bouche_fermer(self) :
            self.canne.delete(self.bouche)
            self.bouche = self.canne.create_line(100,210,200,210,width=10,outline='red')
     
        def bouche_ouverte(self) :
            self.canne.delete(self.bouche)
            self.bouche = cercle(self.canne,150,210,45,'red')
     
     
    #
    if __name__ == "__main__" :
        ap = Application()
        ap.mainloop()
    Je suis pas très convaincue mais.....ENFIN ma tête d'affiche. Je suppose donc que je suis en progrès.
    Quand je pense que j'ai passé toute la journée là-dessus..., et c'est pas fini.

    Donc maintenant, la tête s'affiche, mais quand je clique sur un bouton j'ai : TypeError: bouche_fermer() missing 1 required positional argument: 'self'
    Il y a des selfs partout pourtant

Discussions similaires

  1. Problème de classe.
    Par maminova77 dans le forum Langage
    Réponses: 5
    Dernier message: 30/01/2006, 21h39
  2. Problème sur classe Transformer avec les <!--
    Par tykool dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 10h20
  3. Problème de classe
    Par DeusXL dans le forum DirectX
    Réponses: 15
    Dernier message: 04/12/2005, 14h37
  4. Problème de classe
    Par tidou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/10/2005, 17h49
  5. [FLASH MX2004] Problème de classe
    Par JulPoWeR dans le forum Flash
    Réponses: 1
    Dernier message: 10/07/2005, 22h51

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