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 :

Interruption dans un for ou while


Sujet :

Python

  1. #1
    Membre régulier Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Points : 82
    Points
    82
    Par défaut Interruption dans un for ou while
    Bonjour,

    J'aimerais connaître la procédure pour la détection de l'appuie d'une touche et ainsi interrompre un traitement, dans un For ou while.

    J'ai vu la méthode bind mais cela ne fonctionne pas, enfin ...

    .bind("<Up>"

    j'ai regardé ce lien mais, je ne vois pas l'applicatif : http://effbot.org/tkinterbook/tkinte...d-bindings.htm

    pour une entrée clavier un input un except KeyboardInterrupt ,fonctionne

    une explication, merci

    thierry

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def do_something():
        while 1:
            if flag:
                do
            else:
                break
     
    def on_key_event(k):
        flag = False
     
    myWindow.bind("<Key>", on_key_event)
    Soit tu codes avec des classes et ce sera self.flag, soit non alors tu déclares le flag avec global

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Bonjour,

    l'interface tkinter a besoin d'être rafraichie en boucle pour pouvoir intercepter les interactions, touche, clavier, clic etc....

    soit avec un root.update() ponctuel, mais c'est lent et ça risque d'être irrégulier.

    Soit, et on ne peut pas faire autrement, exécuter en boucle l'interface tkinter avec root.mainloop() puis lancer le code dans un autre thread.

    Voici un exemple :

    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 -*-
    # Python 2 & 3
     
    import time
    import threading
     
    try: # { v2
    	import Tkinter as tkinter
    except: # v3
    	import tkinter
    # }
     
    def callback_bind_escape(event=None, *args): # event contient des informations sur la position souris, l'élément sélectionné/focused
    	global loop_status, t_main
     
    	loop_status = False
    	print("Boucle arrêtée")
    	t_main.join(timeout=0.1) # pour éviter "RuntimeError: main thread is not in main loop" après le destroy; si le thread essaie encore d'écrire dans le root
    	root.destroy()
    	return
     
    def main():
    	global loop_status, label_var
     
    	loop_status = True
    	loop_iteration = 0
    	print("Appuyez sur Échap pour arrêter...")
    	while loop_status:
    		loop_iteration += 1
    		print(loop_iteration)
    		time.sleep(1)
    	return
     
     
    if __name__ == "__main__":
    	root = tkinter.Tk()
    	root.bind('<Escape>', callback_bind_escape) # Escape key
    	t_main = threading.Thread(target=main)
    	t_main.start() # Non bloquant
    	root.mainloop() # Bloquant jusqu'au destroy()
    	print("Done")
    En pièce jointe un exemple complet pour capter plusieurs formes d’interaction avec tkinter bind, en passant par une classe.
    Fichiers attachés Fichiers attachés

  4. #4
    Membre régulier Avatar de Thierry_V
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Août 2013
    Messages : 153
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    merci pour ces informations, je vais essayé de mettre en application

Discussions similaires

  1. Réponses: 37
    Dernier message: 02/03/2006, 01h58
  2. [JLabel] JLabel dans boucle for
    Par clairenes dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 06/01/2006, 00h47
  3. [XML-XPATH] Problème dans un for each
    Par stailer dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 26/12/2005, 12h11
  4. [MySQL] insert into dans un for
    Par pimpmyride dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/12/2005, 17h55
  5. probleme de recordset dans une boucle do while
    Par Shoryu dans le forum ASP
    Réponses: 18
    Dernier message: 05/07/2004, 15h30

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