Python curses终端调整大小时的屏幕刷新异常问题
问题解决:Curses窗口resize时边框显示异常的修复
你的问题核心在于窗口尺寸未随终端resize同步更新——当前代码只是清屏重绘,但窗口本身的大小还是初始创建时的尺寸,导致终端尺寸变化后,窗口无法适配新的空间,出现边框缺失或内容不显示的问题。
修复方案:
需要在收到KEY_RESIZE事件时,重新调整父窗口和子窗口的尺寸,再执行重绘操作。具体修改如下:
修改后的完整代码:
#!/usr/bin/env python3 import curses def repaint(stdscr, flog, wlog): # 同步窗口尺寸到当前终端行列数 flog.resize(curses.LINES, curses.COLS) wlog.resize(curses.LINES - 2, curses.COLS - 2) flog.clear() wlog.clear() flog.box() flog.refresh() wlog.refresh() def main(stdscr): curses.curs_set(0) stdscr.nodelay(True) stdscr.keypad(True) stdscr.refresh() # 初始化窗口 flog = curses.newwin(curses.LINES, curses.COLS, 0, 0) wlog = flog.derwin(curses.LINES - 2, curses.COLS - 2, 1, 1) wlog.scrollok(True) repaint(stdscr, flog, wlog) wlog.addstr("Init application\n") wlog.refresh() finish = False while not finish: try: key = stdscr.getch() if key != -1: if key in (113, 81): # 'q'或'Q'键退出 finish = True elif key == curses.KEY_RESIZE: # 更新终端行列数缓存 curses.update_lines_cols() # 重绘前先同步窗口尺寸 repaint(stdscr, flog, wlog) wlog.addstr("Resize\n") wlog.refresh() except curses.error: pass except Exception: pass if __name__ == "__main__": curses.wrapper(main)
关键修改说明:
- 取消
repaint函数中resize代码的注释,确保每次重绘前,父窗口flog和子窗口wlog的尺寸与当前终端的curses.LINES(行数)、curses.COLS(列数)完全匹配。 - 在处理
KEY_RESIZE事件时,先调用curses.update_lines_cols()更新curses库中缓存的终端行列数,再执行repaint完成尺寸同步和重绘。 - 优化了退出键的判断逻辑,用
in操作符让代码更简洁。
这样修改后,无论终端水平/垂直放大或缩小,窗口都会自动适配新尺寸,边框和内容都能正常显示。
内容的提问来源于stack exchange,提问作者Jose Luis Zabalza
相关产品推荐
相关产品推荐

