Comment tuer une boucle de temps avec une touche?
je suis en train de lire des données en série et d'écrire dans un fichier csv en utilisant une boucle while. Je veux que l'utilisateur soit capable de tuer en boucle une fois qu'ils sentent qu'ils ont recueilli suffisamment de données.
while True:
#do a bunch of serial stuff
#if the user presses the 'esc' or 'return' key:
break
j'ai fait quelque chose comme ça en utilisant opencv, mais cela ne semble pas fonctionner dans cette application (et je ne veux vraiment pas importer opencv juste pour cette fonction de toute façon)...
# Listen for ESC or ENTER key
c = cv.WaitKey(7) % 0x100
if c == 27 or c == 10:
break
So. Comment puis-je laisser l'utilisateur sortir de la boucle?
aussi, je ne veux pas utiliser l'interruption de clavier, parce que le script doit continuer à courir après la boucle while est terminée.
5 réponses
la manière la plus simple est de simplement l'interrompre avec l'habituel Ctrl-C
(SIGINT).
try:
while True:
do_something()
except KeyboardInterrupt:
pass
depuis Ctrl-C
provoque KeyboardInterrupt
pour être soulevé, il suffit de l'attraper en dehors de la boucle et de l'ignorer.
il existe une solution qui ne nécessite aucun module non standard et qui est 100% transportable.""
import thread
def input_thread(a_list):
raw_input()
a_list.append(True)
def do_stuff():
a_list = []
thread.start_new_thread(input_thread, (a_list,))
while not a_list:
stuff()
le code suivant fonctionne pour moi. Il nécessite openCV (import cv2).
le code est composé d'une boucle infinie qui est continuellement à la recherche d'une touche pressée. Dans ce cas, lorsque la touche 'q' Est Pressée, le programme se termine. D'autres touches peuvent être pressées (dans cet exemple 'b' ou 'k') pour effectuer différentes actions telles que changer une valeur variable ou exécuter une fonction.
import cv2
while True:
k = cv2.waitKey(1) & 0xFF
# press 'q' to exit
if k == ord('q'):
break
elif k == ord('b'):
# change a variable / do something ...
elif k == ord('k'):
# change a variable / do something ...
pyHook pourrait aider. http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4
voir crochets de clavier; ceci est plus généralisé-- si vous voulez des interactions de clavier spécifiques et pas seulement en utilisant Clavierinterrupt.
aussi, en général (en fonction de votre utilisation) je pense qu'avoir l'option Ctrl-C toujours disponible pour tuer votre script a du sens.
voir aussi question précédente: détecter en python quelles touches sont pressées
il y a toujours sys.exit()
.
la bibliothèque système dans la bibliothèque de base de Python a une fonction de sortie qui est super pratique lors du prototypage. Le code serait du type:
import sys
while True:
selection = raw_input("U: Create User\nQ: Quit")
if selection is "Q" or selection is "q":
print("Quitting")
sys.exit()
if selection is "U" or selection is "u":
print("User")
#do_something()