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 :

"can't invoke wm command application has been destroyed"


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut "can't invoke wm command application has been destroyed"
    Bonjour à tous

    Je crée un script qui lance une fenêtre Tk() je lance le script il s 'exécute parfaitement

    j'ai placé un boutton qui commande la destruction de la fenêtre root.destroy
    aucun souci

    mais si je relance l'exécution du script le message d'erreur "cant invoke s'affiche"

    Je précise que ce problème intervient quand j'utilise ma distribution winpython et que j'utilise l'interpréteur actif

    si je fais exécuter le script à chaque fois par un interpréteur dédié je n'ai aucun problème.

    Dans mon autre distribution (pyzo) je n'ai aucun souci.

    C'est embêtant car c'est winpython que j'utilise pour les notebook dans lesquels le même souci apparait.

    d'avance merci

    Peut être insérer une ligne qui dise qu'une fois la fenêtre détruite toutes les variables doivent être purgées ?

  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,

    Sans poster un bout de script qui reproduise le problème constaté, pas facile de vous répondre.

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour

    voici mon code j'espère qu'il est lisible

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    import tkinter as tk
    from math import sqrt
    # on rentre le numéro de la génération dans le champ prévu dans la fenêtre graphique; on appuie au clavier sur retour chariot
    # on clique sur le bouton action
    # pour quitter : bouton quit
     
    palette =   ["a","b","c","d","e","f"]
    palette.reverse()
     
     
    def gene(event):
        global a 
        "numero de la génération"
        a = entree.get()
        a = eval(a)
     
    def jeu():
        "lancement du jeu"
        ca.delete("all")
        mavariable.set("en cours")
        tu = Turtle()
        tu.speed(0)
        tu.up()
        tu.goto(0,-300)
        tu.down()
        tu.pensize(4)
        dessin(tu,100,a) 
        mavariable.set("fini")
        entree.delete(0,"end")
     
     
     
    def dessin(t,l,n,coul ="#ff00ff"):
        "ce que fait la tortue t"
     
        if n == 0 :
            pass # on ne fait rien; 
        else : 
            ch = "#00"
            ind = n %5
            ch += palette[ind]
            ch = ch +"000"
            t.color(ch)
            t.begin_fill()
            t.down()
            t.forward(l)
            t.left(90)
            t.forward(l)
            a,b = t.position()
            angle1 = t.heading()
            # on sauvegarde la position ainsi que l'angle avec x'ox
            t.left(90)
            t.forward(l)
            c,d = t.position()
            angle2 = t.heading()
            # nvlle sauvegarde
            t.left(90)
            t.forward(l)
            t.up()
            t.hideturtle()
            t.end_fill()
            t.goto(a,b)
     
            t.setheading(angle1)
            # on oriente la tortue selon l'angle sauvé
            t.left(45)
            t.forward(l*sqrt(2)/2)
            t.left(180)
            t.down()
     
            dessin(t,l*sqrt(2)/2,n-1,ch)
            # appel récursif 
            t.up()
            t.goto(c,d)
            t.down()
            t.setheading(angle2)
            t.right(135)
            t.showturtle()
            dessin(t,l*sqrt(2)/2,n-1,ch)
            #second appel récursif
     
     
     
     
    ##########################################
     
    #####################################        
    # ce qui suit  concerne tkinter sous jacent à turtle : les widgets, boutons etc 
     
    ca = getcanvas()# le  canevas dont dépend la tortue, 
    root =ca.master # 
    root.title("arbre de pythagore")
    # titre de root
    mavariable = tk.StringVar()
    bu1 = tk.Button(root,text = "quit",command = root.destroy,bg = "red")
    bu1.pack(side = "left")
    bu2 = tk.Button(root,text = "action",command = jeu,bg = "blue")
    bu2.pack(side = "left")
    label = tk.Label(root,textvariable = mavariable,fg = "red")
    label2 = tk.Label(root,text = 'génération ?')
    entree  = tk.Entry(root,width = 5)
    entree.pack(side = "right")
     
    entree.bind('<Return>',gene)
    # en appuyant sur retour chariot la fonction gene est appelée
    # à modifier pour ne pas avoir à appuyer sur retourchariot entree.get
    label2.pack(side = "right")
    label.pack()
     
     
    root.mainloop()

  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,

    Je vois que vous mixez Turtle et Tkinter.

    Ce n'est pas interdit mais il vous faut utiliser un RawTurtle.
    Dans le code que vous avez posté, çà ne change pas grand chose:
    ligne 90:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ca = getcanvas()# le  canevas dont dépend la tortue, 
    root =ca.master #
    à remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    root = tk.Tk()
    ca = tk.Canvas(root)
    Puis, ligne 21:
    Ces changements pourront être insuffisants pour corriger votre problème mais sans eux c'est même pas la peine de regarder.
    Le cas échéant, c'est bien de réduire le code que vous postez mais si on ne peut pas l'exécuter, l'aide qu'on pourra vous apporter sera limite.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2013
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup

    C'est parfait.

    Si j'ai bien compris je n'avais pas le bon ordre pour les objets.
    Dans mon esprit j'utilisais turtle . La fenêtre root , canevas étaient déjà sous jacents, il suffisait de les récupérer par "get.canvas"

    Alors qu'en fait il fallait créer les objets dans l'ordre logique root, canevas, tortue.

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

Discussions similaires

  1. ASP.NET the network BIOS command limit has been reached
    Par hottnikks_79 dans le forum ASP.NET
    Réponses: 0
    Dernier message: 04/11/2011, 16h27
  2. Réponses: 1
    Dernier message: 28/08/2008, 09h33
  3. Réponses: 2
    Dernier message: 11/08/2008, 17h24
  4. Réponses: 1
    Dernier message: 09/01/2008, 14h02
  5. [VBA-E] commander application exterieur.
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/05/2006, 21h30

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