使用python ncurses的事件样式键输入

时间:2014-04-26 08:01:50

标签: python ncurses curses

我试图创建一个python脚本,在不断更新curses接口的同时进行大量计算(出于这个问题的目的,想象它是一个进度条)。代码的结构如下:

while notDone:
     compute()
     updateScreen()

我想让用户按一个按钮退出程序,但我知道如何使用curses的唯一方法就是这样:

while notDone:
     compute()
     updateScreen()
     c = screen.getch()
     if c == "q": break

哪个不起作用,因为这意味着每次迭代后,脚本将等待以便用户按一个键。我需要按键才能像大多数python脚本中的Ctrl + C一样工作 - 它会中断脚本并将其杀死。事实上,一种只捕获KeyboardInterrupt异常并像平常一样处理它的方法就可以了。

2 个答案:

答案 0 :(得分:1)

Curses允许输入为阻塞,非阻塞或半封锁" (在那里等待,但只有有限的持续时间)。无需花哨,只需致电nodelay()。在此模式下,如果没有输入等待,getch()将返回ERR。 (您可能也应该在cbreak()之前致电nodelay(),只是为了安全起见。)

答案 1 :(得分:0)

您可以在另一个线程中调用screen.getch(),并在主线程中将其抬起KeyboardInterrupt。以下是如何在CPython中的其他线程中引发异常:https://gist.github.com/liuw/2407154

我不知道这在角落情况下有多稳定,但值得一试。

或者,您也可以在主线程中安装sys.settrace,这会在另一个线程读完一个字符时引发异常,但sys.settrace会使您的主线程变得更慢。