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 :

Modifier l'attribut d'une classe


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur thermiecien
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur thermiecien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Modifier l'attribut d'une classe
    J'ai ce petit programme ou il s'agit juste de fermer la bouche d'un 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
     
     
    from tkinter import *
     
    def cercle(can, x, y, r):
        "dessin d'un cercle de rayon <r> en <x,y> dans le canevas <can>"
        can.create_oval(x-r, y-r, x+r, y+r)
     
    class Application(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.can= Canvas(self, width=400, height=400, bg='white')
            self.can.pack(side=TOP, padx=5, pady=5)
            self.v1 = Visage(self.can,200, 200)
            Button(self, text="Fermer", command=self.v1.fermer).pack(side =LEFT)
            Button(self, text="Ouvir", command=self.v1.ouvrir).pack(side =LEFT)
     
    class Visage(object):
        def __init__(self, canev, x, y):
            self.canev, self.x, self.y = canev, x, y
            cercle(self.canev, self.x, self.y, 30)
            cercle(self.canev,self.x-15,self.y-15,10)
            cercle(self.canev,self.x+15,self.y-15,10)
            self.bouche=cercle(self.canev,self.x,self.y+15,10)
     
     
        def fermer(self):
            self.canev.delete(self.bouche) 
            self.bouche = self.canev.create_line(self.x-15, self.y+15, self.x+15, self.y+15)
     
        def ouvrir(self):
            self.canev.delete(self.bouche)
            self.bouche=cercle(self.canev,self.x,self.y+15,10)
     
    app = Application()
    app.mainloop()
    Comment faire pour supprimer l'attribut self.bouche une fois qu'on actionne fermer?

    Merci pour votre aide

    Roman

  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,

    Il serait bon que vous suiviez un tuto. sur les classes. Car si on répond littéralement à votre question:
    Comment faire pour supprimer l'attribut self.bouche une fois qu'on actionne fermer?
    on pourrait dire:
    Je crée une "class A"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> class A: pass
    ...
    Je fabrique une instance de "A":
    Puis un attribut (de l'instance) "foo" en lui associant 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a.foo = 1
    >>> a.foo
    1
    Pour détruire l'attribut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> del a.foo
    >>> a.foo
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'A' object has no attribute 'foo'
    >>>
    Mais quand je lis votre code et que j'y trouve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def cercle(can, x, y, r):
        "dessin d'un cercle de rayon <r> en <x,y> dans le canevas <can>"
        can.create_oval(x-r, y-r, x+r, y+r)
     
    ....
     
            self.bouche=cercle(self.canev,self.x,self.y+15,10)
     
     
        def fermer(self):
            self.canev.delete(self.bouche) 
            self.bouche = self.canev.create_line(self.x-15, self.y+15, self.x+15, self.y+15)
    la question devrait être pourquoi self.canev.delete(self.bouche) ne fonctionne-t-il pas.

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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur thermiecien
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur thermiecien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    D'accord mais ce que je ne comprend, c'est que çà marche pour la fonction ouvrir??

  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
    Citation Envoyé par paffou59 Voir le message
    D'accord mais ce que je ne comprend, c'est que çà marche pour la fonction ouvrir??
    La méthode/callback ouvrir se contente de dessiner un cercle identique et au dessus du précédent.
    Détruit ou pas, on ne voit pas la différence.

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur thermiecien
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur thermiecien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    oui mais il supprime bien la ligne (bouche fermée) avant de dessiner le cercle?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur thermiecien
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur thermiecien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Alors pourquoi self.canev.delete ne fonctionne t'il pas?

  7. #7
    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 paffou59 Voir le message
    Alors pourquoi self.canev.delete ne fonctionne t'il pas?
    Nous y voilà...
    En fait, c'est juste parce que votre fonction "cercle" oublie de retourner l'identifiant de l'item du canvas qu'elle crée.
    Chaque fois que s'exécute "self.bouche=cercle(self.canev,self.x,self.y+15,10)", None est assigné à self.bouche.
    La méthode canvas.delete ignore ce None de façon silencieuse.
    Et c'est la que vous voyez que coder demande de la rigueur et une progression pas à pas car une bêtise à un endroit aura des conséquences plus tard: pas facile ensuite de remonter le fil.

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

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur thermiecien
    Inscrit en
    Avril 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur thermiecien
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Tout à fait d'accord, merci pour l'aide!!

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/04/2014, 12h32
  2. Modifier un attribut représentant une autre classe
    Par piotrr dans le forum Hibernate
    Réponses: 6
    Dernier message: 13/05/2008, 11h58
  3. Modifier en javascript les attributs d'une classe CSS
    Par troumad dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/09/2007, 10h45
  4. [VB.NET] Parcourir les attributs d'une classe
    Par pasqwal dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/02/2005, 09h47
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

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