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()安全使用?
我重写了你的缩小演示以使基本功能正常工作.它有一个非阻塞的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),它会撤消你对终端所做的所有更改,例如在退出之前禁用游标.在调试时它会有很大帮助.
从这里开始,我建议您以非常小的步骤重新添加程序的功能.诅咒是一种痛苦的工作,如果你立刻做了很多改变,很难弄清楚哪一个导致事情破裂.祝好运!
| 归档时间: |
|
| 查看次数: |
4016 次 |
| 最近记录: |