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) Dernière instruction non exécutée avant sortie fenêtre [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut (tkinter) Dernière instruction non exécutée avant sortie fenêtre
    Bonjour à tous, nouveau venu sur le forum, je voudrais être éclairé sur un problème simple qui me résiste.
    (Je n'ai pas trouvé dans les recherches de sujet similaire).
    Je prendrai l' exemple ci-dessous.
    Sans l'instruction fen.quit(), Le code affiche dans la fenêtre les coordonnées de la souris où je clique, et si je clique dans la zone SE, il m'affiche bien le texte 'A bientôt'.
    Mais si j'active le fen.quit() derrière, alors le texte 'A bientôt' ne s'affiche pas avant que la fenêtre se ferme.
    Est-ce un problème de rafraîchissement ?
    D'avance, merci.

    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
     
    from tkinter import *
     
    def pointeur(event):
        chaine.configure(text = "Clic détecté en X =" + str(event.x) +", Y =" + str(event.y))
        if event.x>180 and event.y>130:
            text=Label(fen,text='A bientôt')
            text.grid(row=2)
            #fen.quit()
     
     
     
    fen = Tk()
     
    cadre = Canvas(fen, width =200, height =150, bg="light yellow")
    cadre.bind("<Button-1>", pointeur)
    cadre.grid()
    chaine = Label(fen)
    chaine.grid(row=1)
     
    fen.mainloop()
    fen.after(1500)
    fen.destroy()

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

    Citation Envoyé par Milag Voir le message
    Mais si j'active le fen.quit() derrière, alors le texte 'A bientôt' ne s'affiche pas avant que la fenêtre se ferme.
    Est-ce un problème de rafraîchissement ?
    Une autre façon de voir les choses est que çà s'affiche trop peu de temps pour être vu.
    En fait, .quit fait sortir de l'appel à mainloop. Ajoutez un time.sleep(...) juste après et vous aurez l'effet recherché.

    - 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
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Merci, je n'avais pas pensé à ça.
    Par contre j'ai essayé un time.sleep() de 2 secondes après mon texte 'à bientôt', avant ou après le .quit() (et même avant ou après le .mainloop()) mais rien n'y fait, il ne m'affiche toujours pas le 'A bientôt' dans la version où le .quit est activé. Etrange.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    Citation Envoyé par Milag Voir le message
    Merci, je n'avais pas pensé à ça.
    Par contre j'ai essayé un time.sleep() de 2 secondes après mon texte 'à bientôt', avant ou après le .quit() (et même avant ou après le .mainloop()) mais rien n'y fait, il ne m'affiche toujours pas le 'A bientôt' dans la version où le .quit est activé. Etrange.
    Il faut éviter les time.sleep dans les callbacks... après mainloop çà devrait fonctionner. Maintenant, il faut poster le code pour voir dans quel piège vous êtes tombé (ou si j'ai bien compris votre problème).

    - 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
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Voici l'essai avec .sleep après .mainloop : il me donne toujours, dès que je clique dans la zone de sortie, une fenêtre qui se maintient 2 s avec uniquement les dernières coord. affichées et pas de message 'à bientôt' :
    (si je désactive le .quit le message apparaît bel et bien)

    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
     
    from tkinter import *
    import time
     
    def pointeur(event):
        chaine.configure(text = "Clic détecté en X =" + str(event.x) +", Y =" + str(event.y))
        if event.x>180 and event.y>130:
            text=Label(fen,text='A bientôt')
            text.grid(row=2)
            fen.quit()
     
     
     
     
    fen = Tk()
     
    cadre = Canvas(fen, width =200, height =150, bg="light yellow")
    cadre.bind("<Button-1>", pointeur)
    cadre.grid()
    chaine = Label(fen)
    chaine.grid(row=1)
     
    fen.mainloop()
    time.sleep(2)
    #fen.after(500)
    fen.destroy()

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    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 699
    Par défaut
    ah oui, tkinter est paresseux, il exécute le .quit en oubliant le reste à faire.
    Ajoutez juste un fen.update_idletasks() entre .mainloop et time.sleep.

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

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Yes ! Ca fonctionne enfin !

    Voici le code fonctionnel, (j'en profite pour éviter le module time) :

    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
     
    from tkinter import *
    #import time
     
    def pointeur(event):
        chaine.configure(text = "Clic détecté en X =" + str(event.x) +", Y =" + str(event.y))
        if event.x>180 and event.y>130:
            text=Label(fen,text='A bientôt')
            text.grid(row=2)
            fen.quit()
     
     
     
     
    fen = Tk()
     
    cadre = Canvas(fen, width =200, height =150, bg="light yellow")
    cadre.bind("<Button-1>", pointeur)
    cadre.grid()
    chaine = Label(fen)
    chaine.grid(row=1)
     
    fen.mainloop()
    fen.update_idletasks()
    #time.sleep(2)
    fen.after(500)
    fen.destroy()

    Est-ce à dire que tkinter ne serait pas si bien implémenté que ça ? Et merci encore !

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

    Vous pourriez simplifiez tout çà en écrivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def pointeur(event):
        chaine.configure(text = "Clic détecté en X =" + str(event.x) +", Y =" + str(event.y))
        if event.x>180 and event.y>130:
            text=Label(fen,text='A bientôt')
            text.grid(row=2)
            fen.after(500, fen.quit)
    Dans ce cas, comme il vide ce qu'il y a en attente avant de sortir pas besoin d'écrire des instructions après la sortie de mainloop.

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

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mars 2018
    Messages : 5
    Par défaut
    Effectivement, cela fonctionne parfaitement. Une option intéressante de la méthode .after que je n'avais pas assez fouillée. Merci une fois encore. Le code est bien plus propre ainsi.

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

Discussions similaires

  1. [Partenaire] Chrysalis RPG - dernière phase avant sortie!
    Par pchambon dans le forum Autres
    Réponses: 0
    Dernier message: 30/06/2013, 21h15
  2. onAction - instructions non exécutées
    Par RaoulPierre dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/04/2012, 09h56
  3. Réponses: 0
    Dernier message: 25/04/2008, 09h56
  4. Réponses: 2
    Dernier message: 15/12/2007, 16h52
  5. instruction non exécutée
    Par illegalsene dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/05/2006, 14h42

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