Comment détecter la pression sur les touches ESCape en Python?

J’exécute un processus dans une fenêtre de commande (Windows 7, Python 3.1) où je voudrais que l’utilisateur abandonne le processus en appuyant sur la touche Échap. Cependant, appuyer sur la touche Echap ne semble pas faire quoi que ce soit :-(, la boucle ne rompt jamais. J’ai également essayé de lancer le script depuis mon IDE (Wing), mais encore une fois, la boucle ne peut pas être interrompue.

Ce qui suit est une version simplifiée de mon test de validation de principe …

import msvcrt import time aborted = False for time_remaining in range(10,0,-1): # First of all, check if ESCape was pressed if msvcrt.kbhit() and msvcrt.getch()==chr(27): aborted = True break print(str(time_remaining)) # so I can see loop is working time.sleep(1) # delay for 1 second #endfor timing loop if aborted: print("Program was aborted") else: print("Program was not aborted") time.sleep(5) # to see result in command window before it disappears! 

Si quelqu’un pouvait me dire où je pourrais me tromper, je vous en serais très reconnaissant.

Les chaînes Python 3 sont unicode et doivent donc être codées en octets pour la comparaison. Essayez ce test:

 if msvcrt.kbhit() and msvcrt.getch() == chr(27).encode(): aborted = True break 

Ou ce test:

 if msvcrt.kbhit() and msvcrt.getch().decode() == chr(27): aborted = True break 

Ou ce test:

 if msvcrt.kbhit() and ord(msvcrt.getch()) == 27: aborted = True break 

Vous devriez vraiment diminuer plus, comme celui-ci ci-dessous:

 >>> import msvcrt >>> ch = msvcrt.getch() # Press esc >>> ch b'\x1b' >>> chr(27) '\x1b' >>> ch == chr(27) False 

Voici donc le problème: msvcrt.getch() renvoie des bytes , chr(27) renvoie une ssortingng . En Python 3, ce sont deux types distincts, donc la partie ” == ” ne fonctionnera jamais et l’instruction if sera toujours évaluée comme False .

La solution devrait être évidente pour vous.

En savoir plus sur les chaînes et les octets, du livre Dive into Python 3.

La console interactive est très utile pour le débogage, essayez de l’utiliser plus 🙂

Vous n’avez pas besoin d’encoder, décoder, chr, ord, ….

 if msvcrt.kbhit() and msvcrt.getch() == b'\x1b': 

ou si vous souhaitez voir “27” dans le code quelque part:

 if msvcrt.kbhit() and msvcrt.getch()[0] == 27: 

Code compatible Python 2/3:

 import time, sys ESC = '\x1b' PY3K = sys.version_info >= (3,) if PY3K: from msvcrt import kbhit, getwch as _getch else: from msvcrt import kbhit, getch as _getch while not kbhit() or _getch() != ESC: print(time.asctime()) time.sleep(1) 

Les parties de code sont extraites du module de pager avec plus de choses à l’intérieur.

Avez-vous essayé d’utiliser une clé différente pour tester si ce n’est pas juste cette clé?

Avez-vous également essayé les exemples de ( http://effbot.org/librarybook/msvcrt.htm ) pour voir s’ils fonctionnaient?