导入curses模块向屏幕添加多段文本时终端报错该如何解决?
报错原因排查
分两种最常见的报错场景对应不同原因:
- 若报错为
ModuleNotFoundError: No module named '_curses':你使用的是Windows系统,Windows默认没有内置curses依赖库,直接导入会失败。 - 若报错为
_curses.error: addstr() returned ERR:你调用addstr(y, x, 文本)时指定的坐标超出了当前终端的实际可显示范围。curses的行、列坐标都从0开始计数,默认不支持越界写入,一旦写入位置超过终端最大行数/列数就会直接抛出错误。比如终端当前高度只有12行时,你指定在第15行写入内容就会触发该报错。
对应解决方案
针对Windows系统缺失curses的问题
执行以下命令安装Windows适配的curses库即可:pip install windows-curses
针对坐标越界的问题
方案1:调整写入坐标为更小值
直接把行号、列号改小,比如把15行的内容调整到第5行写入,适配绝大多数终端的默认尺寸。
方案2:新增终端尺寸检测逻辑
写入内容前先获取当前终端的最大尺寸,判断坐标合法后再写入,示例代码如下:
import curses from curses import wrapper def main(stdscr): # 获取终端当前最大行数、列数,计数从0开始所以最大值为返回值减1 max_row, max_col = stdscr.getmaxyx() stdscr.clear() # 坐标合法再写入 if 10 < max_row and 22 < max_col: stdscr.addstr(10, 10, "Hello World!") stdscr.addstr(10, 12, "overwritten") if 5 < max_row and 25 < max_col: stdscr.addstr(5, 25, "Tim is great.") stdscr.refresh() stdscr.getch() wrapper(main)
注意:运行代码时不要把终端窗口缩到过小,否则也会触发越界错误。如果需要适配任意窗口尺寸,可以监听终端resize事件动态调整内容坐标。
内容的提问来源于stack exchange,提问作者Susmita Dey
相关产品推荐
相关产品推荐

