2012-11-01 4 views
46

私はシリアルデータを読み込み、whileループを使ってcsvファイルに書き込みます。十分なデータを収集していると感じたら、whileループを強制終了できるようにします。キーストロークでwhileループを殺すには?

while True: 
    #do a bunch of serial stuff 

    #if the user presses the 'esc' or 'return' key: 
     break 

私はこの使用してOpenCVのようなものを行っているが、それは、このアプリケーションで作業していないようです(と私は本当にとにかくちょうどこの機能のためのOpenCVをインポートしない)...

 # Listen for ESC or ENTER key 
     c = cv.WaitKey(7) % 0x100 
     if c == 27 or c == 10: 
      break 

So.ユーザーはループから抜け出すことができますか?

また、whileループが終了した後でもスクリプトを実行する必要があるため、キーボード割り込みは使用しません。

答えて

80

最も簡単な方法は、普通のCtrl-C(SIGINT)で中断することです。

try: 
    while True: 
     do_something() 
except KeyboardInterrupt: 
    pass 

上げることがKeyboardInterrupt原因Ctrl-Cので、ちょうどループの外でそれをキャッチし、それを無視します。

+1

@Chris:なぜあなたはそれを試してみませんか? (そしてコメントしてください) – SilentGhost

+0

私はコメントの直後に...削除するのを忘れました。私はこの答えを受け入れたとマークしました。 – Chris

+0

これは 'do_something()'中に '^ C'が発行されたときにクラッシュします(エラートレースバックを取得します)。どのようにこれを避けることができますか? – Atcold

4

pyHookが役立ちます。 http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

キーボードフックを参照してください。 KeyboardInterruptを使用するだけでなく、特定のキーボードのやりとりが必要な場合には、これはより一般化されています。

また、一般的には(あなたの用途次第で)、スクリプトを強制終了するためにCtrl-Cオプションを使用することが理にかなっていると思います。 Detect in python which keys are pressed

18

全く非標準モジュールを必要とせず、次のコードは、私の作品

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() 
+1

Python 3+を使用している人のためのメモ: raw_input()の名前がinput()に変更され、スレッドモジュールが現在_threadになりました。 – Wieschie

+0

Python 3の文書では、Python 3では動作しませんでした: "スレッドは、割り込みと妙にやりとりします。KeyboardInterrupt例外は任意のスレッドで受け取ります(信号モジュールが利用可能な場合、割り込みは常にメインスレッドに移動します)。 " – Towhid

+0

@Towhidしかし、これは割り込みを使用しません。 stdinからの読み込みを使用します。 – Artyer

6

搬型100%である解決策があります:

も前の質問を参照してください。 openCV(import cv2)が必要です。

コードは、連続して押されたキーを探している無限ループで構成されています。この場合、「q」キーが押されると、プログラムは終了する。他のキー(この例では 'b'または 'k')を押すと、変数値の変更や関数の実行など、さまざまな操作を実行できます。

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 ... 
+2

良いですが、すでに何か他の目的で使っていない限り、cv2は重すぎます。 – ogurets

関連する問題