如何杀一个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被引发,只要将其捕获到循环之外并忽略它即可。

有一个解决scheme,不需要非标准的模块,是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() 

pyHook可能会有帮助。 http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

看键盘钩子; 这是更普遍的 – 如果你想特定的键盘交互,而不是只使用KeyboardInterrupt。

另外,一般情况下(取决于你的使用)我认为有Ctrl-C选项仍然可用来杀死你的脚本是有道理的。

另请参见上一个问题: 在Python中检测哪些键被按下

下面的代码适用于我。 它需要openCV(导入cv2)。

代码由一个无限循环组成,它不断地查找按下的按键。 在这种情况下,当按下“q”键时,程序结束。 可以按其他键(在本例中为'b'或'k')执行不同的操作,例如更改variables值或执行function。

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