2012-11-01 614 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 

所以。我如何让用户跳出循环?

此外,我不想使用键盘中断,因为脚本需要在while循环终止后继续运行。

回答

80

最简单的方法是用通常的Ctrl-C(SIGINT)中断它。

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

由于Ctrl-C原因KeyboardInterrupt待提高,正好赶上它的外循环,而忽略它。

+1

@Chris:你为什么不试试。 (然后评论) – SilentGhost

+0

我做了正确的评论后...忘了删除它。我已经接受了这个答案。 – Chris

+0

这个崩溃(我得到错误追踪)是''C'在'do_something()'中发出。你如何避免这种情况? – Atcold

18

有,不需要非标准模块,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() 
+1

对于那些使用Python 3+的人来说: raw_input()已被重命名为input(),并且线程模块现在是_thread。 – Wieschie

+0

根据python 3的文档,在python 3中没有工作:“线程与中断奇怪地交互:KeyboardInterrupt异常将被任意线程接收(当信号模块可用时,中断总是进入主线程)。 “ – Towhid

+0

@Thohid但是这不使用中断。它使用stdin的读取。 – Artyer

6

下面的代码对我的作品的解决方案。它需要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 ... 
+2

好,但是cv2太重了,除非你已经用它来做别的事情了。 – ogurets