developer tip

키 입력으로 while 루프를 죽이는 방법?

optionbox 2020. 11. 7. 09:15
반응형

키 입력으로 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 루프가 종료 된 후에도 스크립트가 계속 실행되어야하므로 키보드 인터럽트를 사용하고 싶지 않습니다.


가장 쉬운 방법은 일반적인 Ctrl-C(SIGINT)로 중단하는 것입니다 .

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

이후 Ctrl-C원인이 KeyboardInterrupt제기 될 단지 루프 밖에서 그것을 잡을 그것을 무시한다.


비표준 모듈이 필요하지 않고 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()

다음 코드가 나를 위해 작동합니다. 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 ...

pyHook이 도움이 될 수 있습니다. http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

키보드 후크를 참조하십시오. 이것은보다 일반화되어 있습니다. KeyboardInterrupt를 사용하는 것이 아니라 특정 키보드 상호 작용을 원할 경우.

또한 일반적으로 (사용에 따라) Ctrl-C 옵션을 사용하여 스크립트를 종료하는 것이 합리적이라고 생각합니다.

이전 질문도 참조하십시오 : 어떤 키가 눌 렸는지 파이썬에서 감지


Python 3.7의 경우 user297171의 멋진 답변을 복사하고 변경하여 테스트 한 Python 3.7의 모든 시나리오에서 작동합니다.

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

항상 sys.exit()있습니다.

파이썬 핵심 라이브러리의 시스템 라이브러리에는 프로토 타이핑 할 때 매우 편리한 종료 기능이 있습니다. 코드는 다음과 같습니다.

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

이것은 도움이 될 수 있습니다 설치 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 

참고 URL : https://stackoverflow.com/questions/13180941/how-to-kill-a-while-loop-with-a-keystroke

반응형