我试图创建一个python脚本,在不断更新curses接口的同时进行大量计算(出于这个问题的目的,想象它是一个进度条)。代码的结构如下:
while notDone:
compute()
updateScreen()
我想让用户按一个按钮退出程序,但我知道如何使用curses的唯一方法就是这样:
while notDone:
compute()
updateScreen()
c = screen.getch()
if c == "q": break
哪个不起作用,因为这意味着每次迭代后,脚本将等待以便用户按一个键。我需要按键才能像大多数python脚本中的Ctrl + C一样工作 - 它会中断脚本并将其杀死。事实上,一种只捕获KeyboardInterrupt异常并像平常一样处理它的方法就可以了。
答案 0 :(得分:1)
Curses允许输入为阻塞,非阻塞或半封锁" (在那里等待,但只有有限的持续时间)。无需花哨,只需致电nodelay()
。在此模式下,如果没有输入等待,getch()
将返回ERR
。 (您可能也应该在cbreak()
之前致电nodelay()
,只是为了安全起见。)
答案 1 :(得分:0)
您可以在另一个线程中调用screen.getch()
,并在主线程中将其抬起KeyboardInterrupt
。以下是如何在CPython中的其他线程中引发异常:https://gist.github.com/liuw/2407154
我不知道这在角落情况下有多稳定,但值得一试。
或者,您也可以在主线程中安装sys.settrace
,这会在另一个线程读完一个字符时引发异常,但sys.settrace
会使您的主线程变得更慢。