7

我用python写了一个curses程序。它运行良好。但是,当我使用 时nodelay(),程序在终端启动后立即退出,根本没有显示任何内容(只是一个新提示)。

编辑

此代码将重现该错误:

sc = curses.initscr()

sc.nodelay(1) # 但是去掉这行可以让程序正常运行

对于范围内的愤怒(20):
        sc.addstr(愤怒,1,“嗨”)

这是我的完整代码

导入诅咒,时间,系统,随机

定义油漆(x,y,i):
        #...
定义字符串(s,y):
        #...

定义饲料():
        #...

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

 # vars + 颜色初始化

对于范围内的愤怒(20):
        尝试:
                dir = chr(sc.getch())

                sc.clear()

                喂养()

                #很多ifs

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

                对于身体点:
                        油漆(*点,我=2)

                sc.move(height-1, 1)
                sc.refresh()
                时间.睡眠(等待)

        例外为 e:
                打印 sys.exc_info()[0], e

sc.getch()
诅咒.beep()

诅咒.endwin()

为什么会发生这种情况,如何nodelay()安全使用?

4

2 回答 2

8

我已经重写了您的缩小演示以使基本功能正常工作。它有一个非阻塞的 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),它将撤消您对终端所做的所有更改,例如在退出之前禁用光标。在调试时它很有帮助。

从这里开始,我建议您以非常小的步骤重新添加程序的功能。使用诅咒是一种痛苦,如果您一次进行大量更改,则很难弄清楚是哪一个导致了事情的崩溃。祝你好运!

于 2012-12-22T22:13:16.743 回答
0

在有没有sc.nodelay()条线的情况下运行你的小测试程序时,我看不出有什么区别。

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

于 2012-12-22T21:06:58.960 回答