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 :

Swinnen 13.21 probleme delete() dans tkinter [Python 3.X]


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Par défaut Swinnen 13.21 probleme delete() dans tkinter
    Bonjour,
    Sur l'exercice 13.21 du Swinnen (visage dans une frame qui alterne bouche ouverte/fermée) je n'arrive pas à effacer la bouche "precedente" lors de l'appel de la méthode ouvrir ou fermer.
    Merci pour votre aide.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #exercice13.21
     
    from tkinter import *
     
    def cercle(can,x, y, r, coul ='black'):
        "tracé d'un cercle de centre (x,y) et de rayon r"
        can.create_oval(x-r, y-r, x+r, y+r, outline=coul)
     
     
    class Application(Frame):
        def __init__(self):
            "Constructeur de la fenetre principale"
            #construction de widget parent
            Frame.__init__(self)  # appel au constructeur de la classe parente
            self.can = Canvas(self,width=400,height=400) #appel canvas
            self.can.pack()
            self.vis = Visage(self.can)  #appel visage
            Button(self, text="ouvrir", command=self.vis.ouvrir).pack()
            Button(self, text="fermer", command=self.vis.fermer).pack()
            self.pack()
     
     
     
    class Visage(object):
        def __init__(self,canev):
            "dessin d'un visage dans un canevas <canev>"
            self.canev = canev
            cc =[[100, 100, 80, 'red'], # visage
            [70, 70, 15, 'blue'], # yeux
            [130, 70, 15, 'blue'],
            [70, 70, 5, 'black'],
            [130, 70, 5, 'black'],
            [44, 115, 20, 'red'], # joues
            [156, 115, 20, 'red'],
            [100, 95, 15, 'purple']]# nez
            self.ouvrir()
     
     
            # on trace tous les cercles à l'aide d'une boucle :
            i =0
            while i < len(cc): # parcours de la liste
                el = cc[i] # chaque élément est lui-même une liste
                cercle(self.canev,el[0], el[1], el[2], el[3])
                i += 1
     
        def ouvrir(self):
            "ouverture de la bouche"
            self.canev.delete(self.fermer)   #effacement fermer
            self.ouvrir = cercle(self.canev,100, 145, 30, 'purple') #dessin ouvrir
     
     
        def fermer(self):
            "fermeture de la bouche"
            self.canev.delete(self.ouvrir) #effacement ouvrir
            self.fermer  = self.canev.create_line(70, 150, 130,150) #dessin fermer
     
     
    app=Application()
    app.mainloop()

  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,

    Ben, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           self.ouvrir = cercle(self.canev,100, 145, 30, 'purple') #dessin ouvrir
    suppose que la fonction appelée retourne autre chose que None.

    D'autre part, la méthode ouvrir est écrasée par l'assignation self.ouvrir = ....
    Dans votre cas, çà va fonctionner: le binding sera fait vers l'objet fonction avant l'assignation.
    Mais faites attention aux noms de vos variables/attributs car vous n'aurez pas toujours de la chance.

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Par défaut
    Merci pour votre reponse. J'ai modifié le code en ce sens. Est t il possible de simplifier le code, notamment l'utilisation de la methode delete()?
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #exercice13.21
     
    from tkinter import *
     
    def cercle(can,x, y, r, coul ='black'):
        "tracé d'un cercle de centre (x,y) et de rayon r"
        can.create_oval(x-r, y-r, x+r, y+r, outline=coul)
     
     
    class Application(Frame):
        def __init__(self):
            "Constructeur de la fenetre principale"
            #construction de widget parent
            Frame.__init__(self)  # appel au constructeur de la classe parente
            self.can = Canvas(self,width=400,height=400) #appel canvas
            self.can.pack()
            self.vis = Visage(self.can)  #appel visage
            Button(self, text="ouvrir", command=self.ouvrir).pack()
            Button(self, text="fermer", command=self.fermer).pack()
            self.pack()
     
        def ouvrir(self):
            "ouverture de la bouche"
            self.can.delete(ALL)   #effacement visage
            self.vis= Visage(self.can)#appel visage
            self.vis.bouche_o() #dessin ouvrir
     
     
        def fermer(self):
            "fermeture de la bouche"
            self.can.delete(ALL) #effacement visage
            self.vis= Visage(self.can)#appel visage
            self.vis.bouche_f() #dessin fermer
     
     
     
    class Visage(object):
     
        def __init__(self,canev):
            "dessin d'un visage dans un canevas <canev>"
            self.canev = canev
            cc =[[100, 100, 80, 'red'], # visage
            [70, 70, 15, 'blue'], # yeux
            [130, 70, 15, 'blue'],
            [70, 70, 5, 'black'],
            [130, 70, 5, 'black'],
            [44, 115, 20, 'red'], # joues
            [156, 115, 20, 'red'],
            [100, 95, 15, 'purple']]# nez
     
     
     
            # on trace tous les cercles à l'aide d'une boucle :
            i =0
            while i < len(cc): # parcours de la liste
                el = cc[i] # chaque élément est lui-même une liste
                cercle(self.canev,el[0], el[1], el[2], el[3])
                i += 1
     
        def bouche_o(self):
            "bouche ouverte"
            cercle(self.canev,100, 145, 30, 'purple') #dessin ouvrir
     
        def bouche_f(self):
            "bouche fermée"
            self.canev.create_line(70, 150, 130,150) #dessin fermer
     
     
     
     
    app=Application()
    app.mainloop()

  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
    Salut,

    Citation Envoyé par loncle Voir le message
    Merci pour votre reponse. J'ai modifié le code en ce sens.
    Vous avez préféré faire un delete('all') de tous les items pour les recréer à chaque fois en changeant celui qui représente la bouche. Ca fonctionne mais... c'est une façon un peu sauvage de faire çà (et complètement différente de la première).

    Citation Envoyé par loncle Voir le message
    Est t il possible de simplifier le code, notamment l'utilisation de la methode delete()?
    On peut se passer de "delete" !!

    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
    # -*- coding:utf-8 -*-
     
    import tkinter as tk
     
    CIRCLES = [[100, 100, 80, 'red'], # visage
            [70, 70, 15, 'blue'], # yeux
            [130, 70, 15, 'blue'],
            [70, 70, 5, 'black'],
            [130, 70, 5, 'black'],
            [44, 115, 20, 'red'], # joues
            [156, 115, 20, 'red'],
            [100, 95, 15, 'purple']]# nez
     
    def create_widget(master=None):
     
        frame = tk.Frame(master)
        canvas = tk.Canvas(frame, width=400, height=400)
     
        def create_circle(x, y, r, color='black', **kwds):
            return canvas.create_oval(x - r, y - r, x + r, y + r, outline=color, **kwds)
     
        for e in CIRCLES:
            create_circle(*e)
     
        create_circle(100, 145, 30, 'purple', tag='opened', state='normal')
        canvas.create_line(70, 150, 130,150, tag='closed', state='hidden')
     
        states = ['normal', 'hidden']
        def do_toggle():
            for item in ('opened', 'closed'):
                ns = states['normal' == canvas.itemcget(item, 'state')]
                canvas.itemconfigure(item, state=ns)
     
        canvas.pack()
     
        tk.Button(frame, text='toggle', command=do_toggle).pack()
        return frame
     
    widget = create_widget()
    widget.pack()
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/03/2015, 15h47
  2. Probleme avec un print dans Tkinter
    Par Patatarte dans le forum Tkinter
    Réponses: 2
    Dernier message: 21/11/2009, 11h51
  3. probleme requete DELETE dans Postgres
    Par youp_db dans le forum JDBC
    Réponses: 2
    Dernier message: 13/11/2006, 17h35
  4. probleme de delete dans un destructeur
    Par Chewbi dans le forum C++
    Réponses: 6
    Dernier message: 12/03/2006, 00h29
  5. [BCB6] Probleme onglet dans IDE
    Par bgautier dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/01/2004, 16h20

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