我在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()
?
答案 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()
行的没有区别。
两种情况都不会在屏幕上打印任何内容......