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 :

tkinter et et Canvas destroy


Sujet :

Python

  1. #1
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 931
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 931
    Par défaut tkinter et et Canvas destroy
    Bonjour à tous,

    dans mon code simpliste suivant, j'ai un bouton qui me créer un canvas à chaque fois que je clique dessus.
    Mais je ne conmprends pas pourquoi mon can1.destroy ne fonctionne qu'une seule fois. En gros il me supprime une fois le canvas et ensuite, il ne fonctionne plus ?
    Faut-il que je créé aussi une fonction canvas destroy ?

    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
     
    # fenêtre simpliste
     
    from tkinter import *
     
    def can_create():
        can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
        can1.pack(side=RIGHT)
     
     
    # Création du widget principal ("maître") :
     
    fen1 = Tk()
     
    # création des widgets "esclaves" :
     
    tex1 = Label(fen1, text='Bonjour tout le monde !', fg='red')
    tex1.pack()
    can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
    can1.pack(side=RIGHT)
    bou1 = Button(fen1, text='Canevas Destroy', command = can1.destroy)
    bou1.pack()
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.pack(side=BOTTOM)
    bou3 = Button(fen1, text='Canevas Create', command = can_create)
    bou3.pack(side=LEFT)
     
     # démarrage du réceptionnaire d'événements
     
    fen1.mainloop()
     
    # On met le programme en pause pour éviter qu'il ne se referme (Windows)
     
    os.system("pause")

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 031
    Par défaut
    Quand un enseignant écrit sur le tableau, et qu'il a rempli entièrement la surface par ses écritures, que fait-il ?
    1. Il détruit le tableau
    2. Il efface le tableau

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

    Citation Envoyé par sam01 Voir le message
    Mais je ne conmprends pas pourquoi mon can1.destroy ne fonctionne qu'une seule fois. En gros il me supprime une fois le canvas et ensuite, il ne fonctionne plus ?
    Ca ne fonctionne plus parce que vous avez oublié la différence entre variable globales et locales.
    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
    # fenêtre simpliste
     
    from tkinter import *
     
    canvas = None
    def create_canvas():
        global canvas
        if not canvas:
            canvas = Canvas(fen1,bg='dark grey',height=200,width=200)
            canvas.pack(side=RIGHT)
     
    def destroy_canvas():
        global canvas
        if canvas:
            canvas.destroy()
            canvas = None
     
    # Création du widget principal ("maître") :
     
    fen1 = Tk()
     
    # création des widgets "esclaves" :
     
    tex1 = Label(fen1, text='Bonjour tout le monde !', fg='red')
    tex1.pack()
    ## can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
    ## can1.pack(side=RIGHT)
    create_canvas()
    bou1 = Button(fen1, text='Canevas Destroy', command = destroy_canvas)
    bou1.pack()
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.pack(side=BOTTOM)
    bou3 = Button(fen1, text='Canevas Create', command = create_canvas)
    bou3.pack(side=LEFT)
     
     # démarrage du réceptionnaire d'événements
     
    fen1.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 931
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 931
    Par défaut
    salut Wiztricks, heu je veux juste rappeler que je suis vraiment débutant dans ce langage donc du coup j'y vais vraiment pas à pas.
    Ok, pour les variables globales. Donc normalement, si je rajoute global dans ma fonction de create_caneva, je rends la variable can1 global du coup elle devrait être reconnu par mon programme principal et du coup,le destroy devrait fonctionner à chaque fois. Ce qu n'est pas la cas :

    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
     
     
    # fenêtre simpliste
     
    from tkinter import *
     
    def can_create():
        global can1 # j'ai ajouté cette ligne
        can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
        can1.pack(side=RIGHT)
     
     
    # Création du widget principal ("maître") :
     
    fen1 = Tk()
     
    # création des widgets "esclaves" :
     
    tex1 = Label(fen1, text='Bonjour tout le monde !', fg='red')
    tex1.pack()
    can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
    can1.pack(side=RIGHT)
    bou1 = Button(fen1, text='Canevas Destroy', command = can1.destroy)
    bou1.pack()
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.pack(side=BOTTOM)
    bou3 = Button(fen1, text='Canevas Create', command = can_create)
    bou3.pack(side=LEFT)
     
     # démarrage du réceptionnaire d'événements
     
    fen1.mainloop()
     
    # On met le programme en pause pour éviter qu'il ne se referme (Windows)
     
    os.system("pause")

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

    Citation Envoyé par sam01 Voir le message
    salut Wiztricks, heu je veux juste rappeler que je suis vraiment débutant dans ce langage donc du coup j'y vais vraiment pas à pas.
    Certes mais çà veut dire que vous devez passer du temps à relire les chapitres qui vont bien dans votre tuto favori. Dans le Swinnen, c'est ici.

    Citation Envoyé par sam01 Voir le message
    Ok, pour les variables globales. Donc normalement, si je rajoute global dans ma fonction de create_caneva, je rends la variable can1 global du coup elle devrait être reconnu par mon programme principal et du coup,le destroy devrait fonctionner à chaque fois.
    Si çà ne fonctionne pas c'est que ce n'est pas encore "Ok, pour les variables globales". Après avoir revu les tutos, lisez mon code et essayez le comprendre plutôt que de vous précipiter...

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

  6. #6
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 931
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 931
    Par défaut
    Salut. En fait je ne me précipite pas. Bien au contraire. J’y vais vraiment pas à pas. Mais je suis obligé de pratiquer un peu sinon je n’intègre pas. En tout cas,c’est comme ça que je fonctionne. Si je ne fais que de la théorie, je crois avoir compris alors qu’en fait il n’en n’est rien. En tout cas je te remercie de m’av mis sur la piste avec cette histore de variable globale mais j’ai préféré repartir de mon code de base au lieu de récupérer bêtement le tien. Ca me permet de mieuc comprendre ce qu’il se passe.

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    1 931
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 931
    Par défaut
    Re wiztricks.
    Je viens de tester et comprendre ton code.
    Mais en fait, c'est bien ce que je me disais : il ne fait pas ce que je souhaite.

    Si tu testes mon code, il est capable de créer de canvas à gogo. Mais il n'en détruit qu'un effectivement.
    Dans ton code, il ne créé qu'un seul canvas à la fois et il n'en détruit qu'un seul.

    Mon but est de pouvoir créer des canvas à gogo (ce qui est déjà le cas dans mon code) et de pouoir les destroyer à gogo aussi.

    J'ai modifié ton code comme suit en retirant la condition if. En faisant ça, il est équivalent au mien, il créer autant de canvas que de clique sur le bouton mais il en supprime qu'un seul à l'exception près que ton code (modifié par moi) génère une erreur lorsque je clique une 2ème fous sur le bouton destroy :

    message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    canvas.destroy notype object has no attribute destroy
    ton code modifié

    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
     
    from tkinter import *
     
    canvas = None
     
    def create_canvas():
        global canvas
        # if not canvas:
        canvas = Canvas(fen1,bg='dark grey',height=200,width=200)
        canvas.pack(side=RIGHT)
     
    def destroy_canvas():
        global canvas
        # if canvas:
        canvas.destroy()
        canvas = None
     
    # Création du widget principal ("maître") :
     
    fen1 = Tk()
     
    # création des widgets "esclaves" :
     
    tex1 = Label(fen1, text='Bonjour tout le monde !', fg='red')
    tex1.pack()
    ## can1 = Canvas(fen1,bg='dark grey',height=200,width=200)
    ## can1.pack(side=RIGHT)
    create_canvas()
    bou1 = Button(fen1, text='Canevas Destroy', command = destroy_canvas)
    bou1.pack()
    bou2 = Button(fen1, text='Quitter', command = fen1.destroy)
    bou2.pack(side=BOTTOM)
    bou3 = Button(fen1, text='Canevas Create', command = create_canvas)
    bou3.pack(side=LEFT)
     
     # démarrage du réceptionnaire d'événements
     
    fen1.mainloop()

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    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 677
    Par défaut
    Citation Envoyé par sam01 Voir le message
    Si tu testes mon code, il est capable de créer de canvas à gogo. Mais il n'en détruit qu'un effectivement.
    Dans ton code, il ne créé qu'un seul canvas à la fois et il n'en détruit qu'un seul.
    Votre code se contente de détruire le canvas correspondant à à celui passé comme commande au bouton "can1.destroy".... Et si on crée d'autres Canvas, impossible de les détruire.

    Citation Envoyé par sam01 Voir le message
    Mon but est de pouvoir créer des canvas à gogo (ce qui est déjà le cas dans mon code) et de pouoir les destroyer à gogo aussi.
    Il n'y a rien dans le code qui permette de traduire "je veux supprimer ce Canvas et pas les autres"... Et relisez votre post initial, çà n'en parle pas non plus et je me suis contenté d'écrire quelque chose de raisonnable à partir des informations que vous avez donné.
    Maintenant, si vous voulez faire autre chose, c'est pas interdit mais je ne vais pas le coder pour vous: vous essayez un truc et si vous ne vous en dépatouillez pas ouvrez une nouvelle discussion pour décrire le soucis que vous avez et poster le code correspondant.

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

Discussions similaires

  1. python tkinter problème de Canvas, Frame
    Par eponge dans le forum Tkinter
    Réponses: 6
    Dernier message: 21/11/2017, 10h46
  2. [Tkinter] recuperer le contenu d'un canvas sous format image
    Par xavier-Pierre dans le forum Tkinter
    Réponses: 2
    Dernier message: 03/04/2006, 20h07
  3. [Tkinter] Insérer une image jpg sur un canvas avec PIL
    Par Kyojimbo dans le forum Tkinter
    Réponses: 2
    Dernier message: 23/02/2006, 16h46
  4. [Tkinter].... Canvas: effacer un objet
    Par airod dans le forum Tkinter
    Réponses: 1
    Dernier message: 23/01/2006, 12h55
  5. [Tkinter] Canvas -> superposition et z-index ?
    Par Olivier_ dans le forum Tkinter
    Réponses: 3
    Dernier message: 02/12/2005, 09h05

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