Python3 + Curses:如何按“q”立即结束程序?

4 投票
2 回答
3233 浏览
提问于 2025-04-18 10:22

当我运行下面的示例代码,只按“q”键时,它会正常结束。但是如果我按下其他任何字符,比如很多换行符和其他字符,然后再按“q”,它就不会退出了,我该怎么解决这个问题呢?

import curses, time

def main(sc):
    sc.nodelay(1)

    while True:
        sc.addstr(1, 1, time.strftime("%H:%M:%S"))
        sc.refresh()

        if sc.getch() == ord('q'):
            break

        time.sleep(1)

if __name__=='__main__': curses.wrapper(main)

2 个回答

0

你可能在找的就是这个函数 window.timeout(delay)。一旦你设置了超时时间,getch 就会在等待 delay 毫秒后返回 -1。

虽然使用 time.sleep(seconds) 也能实现这个功能,但 timeout 的方式要干净很多,用户体验也更顺畅,因为 sleep 会让程序处理用户输入的时间延迟长达 seconds 秒。

6

按下其他键会导致调用 time.sleep(1),你需要等待 n 秒(n 是其他按键的数量)。

去掉 time.sleep 的调用就能解决你的问题。

def main(sc):
    sc.nodelay(1)

    while True:
        sc.addstr(1, 1, time.strftime("%H:%M:%S"))
        sc.refresh()

        if sc.getch() == ord('q'):
            break

        #time.sleep(1) <------

另一种方法是有条件地调用 time.sleep(只有在没有按键被按下时才调用,如果在非阻塞模式下没有按键被按下,getch 会返回 -1):

while True:
    sc.addstr(1, 1, time.strftime("%H:%M:%S"))
    sc.refresh()

    key = sc.getch()
    if key == ord('q'):
        break
    elif key < 0:
        time.sleep(1)

撰写回答