nodelay()导致python curses程序退出

时间:2012-12-22 17:13:05

标签: python ncurses curses

我在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()

2 个答案:

答案 0 :(得分: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)

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

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

答案 1 :(得分:0)

我认为使用运行您的小型测试程序或没有 sc.nodelay()行的没有区别。

两种情况都不会在屏幕上打印任何内容......