You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:25:12