nodelay()导致python curses程序退出

ACa*_*ter 6 python curses ncurses

我在python中编写了一个curses程序.它运行正常.但是,当我使用时nodelay(),程序在终端启动后立即退出,根本没有显示(只是一个新提示).

编辑

此代码将重现该错误:

sc = curses.initscr()

sc.nodelay(1) # But removing this line allows the program to run properly

for angry in range(20):
        sc.addstr(angry, 1, "hi")

这是我的完整代码

import curses, time, sys, random

def paint(x, y, i):
        #...
def string(s, y):
        #...

def feed():
        #...

sc = curses.initscr()
curses.start_color()
curses.curs_set(0)
sc.nodelay(1) #########################################

 # vars + colors inited

for angry in range(20):
        try:
                dir = chr(sc.getch())

                sc.clear()

                feed()

                #lots of ifs

                body.append([x, y])
                body.pop(0)

                for point in body:
                        paint(*point, i=2)

                sc.move(height-1, 1)
                sc.refresh()
                time.sleep(wait)

        except Exception as e:
                print sys.exc_info()[0], e

sc.getch()
curses.beep()

curses.endwin()

为什么会这样,我怎样才能nodelay()安全使用?

Phi*_*lip 7

我重写了你的缩小演示以使基本功能正常工作.它有一个非阻塞的getch().如果在调用getch()时持有Q键,则程序结束,否则循环继续.

import curses, time

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

    for angry in range(20):
        sc.addstr(angry, 1, "hi")
        sc.refresh()

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

        time.sleep(1)

if __name__=='__main__':
    curses.wrapper(main)
Run Code Online (Sandbox Code Playgroud)

我做的最重要的改变是使用curses.wrapper获取屏幕上下文而不是使用curses.initscr().好处是,如果你的程序遇到未捕获的异常(例如点击^ C),它会撤消你对终端所做的所有更改,例如在退出之前禁用游标.在调试时它会有很大帮助.

从这里开始,我建议您以非常小的步骤重新添加程序的功能.诅咒是一种痛苦的工作,如果你立刻做了很多改变,很难弄清楚哪一个导致事情破裂.祝好运!