web-dev-qa-db-ja.com

キーストロークでwhileループを殺すには?

Whileループを使用して、シリアルデータを読み取り、csvファイルに書き込みます。ユーザーが十分なデータを収集したと感じたら、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

そう。ユーザーにループから抜け出させるにはどうすればよいですか?

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

68
Chris

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

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

Ctrl-CKeyboardInterruptを発生させるため、ループの外側でキャッチして無視します。

118
Keith

非標準モジュールを必要とせず、100%輸送可能なソリューションがあります

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()
28
user297171

次のコードは私のために動作します。 openCV(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 ...
10
Luis Jose

pyHookが役立つかもしれません。 http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

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

また、一般的に(使用方法に応じて)Ctrl-Cオプションを使用してスクリプトを強制終了することは理にかなっていると思います。

前の質問も参照してください: pythonで検出されたキー

4
Anov

Python 3.7については、テストしたPython 3.7のすべてのシナリオで動作するように、user297171による非常に良い回答をコピーして変更しました。

import threading as th

keep_going = True
def key_capture_thread():
    global keep_going
    input()
    keep_going = False

def do_stuff():
    th.Thread(target=key_capture_thread, args=(), name='key_capture_thread', daemon=True).start()
    while keep_going:
        print('still going...')

do_stuff()
3
rayzinnz

これはpynputのインストールに役立つ場合があります-pip install pynput

from pynput.keyboard import Key, Listener
def on_release(key):
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
while True:
    with Listener(
            on_release=on_release) as listener:
        listener.join()
    break 
0
ANKIT YADAV

常にsys.exit()があります。

Pythonコアライブラリのシステムライブラリには、プロトタイプ作成時に非常に便利な終了関数があります。コードは次の行に沿っています。

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
Julian Wise