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.

53
demandé sur Chris 2012-11-01 20:04:18

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.

96
répondu Keith 2012-11-01 16:18:02

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()
24
répondu Barafu Albino 2017-10-18 15:47:21

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 ...
9
répondu Luis Jose 2016-09-13 12:07:30

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

4
répondu Anov 2017-05-23 12:03:08

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()
0
répondu Julian Wise 2018-09-24 12:59:02