You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Python Curses库的终端GUI双面板自适应resize问题求助

嘿,我刚好折腾过Curses的终端GUI布局,给你一个完整的解决方案,完美解决你要的双面板、边距预留和自适应resize的需求!

先上可直接运行的代码:

import curses

def main(stdscr):
    # 隐藏光标,让界面更整洁
    curses.curs_set(0)
    # 启用颜色(可选,让面板区分度更高)
    if curses.has_colors():
        curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_DARK_BLUE)
        curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_DARK_GREEN)
    
    while True:
        # 实时获取当前终端的尺寸
        total_lines, total_cols = stdscr.getmaxyx()
        
        # 计算面板参数:上下各留1字符边距,左右+中间分隔各留1字符
        panel_height = total_lines - 2
        # 总宽度减去3个边距(左1、中间分隔1、右1)后平分
        panel_width = (total_cols - 3) // 2
        
        # 创建左边面板:起始位置(1,1),对应上下左右各1边距
        left_panel = curses.newwin(panel_height, panel_width, 1, 1)
        # 创建右边面板:起始x是左边宽度+1(分隔)+1(左边距),y和左边一致
        right_panel_x = 1 + panel_width + 1
        right_panel = curses.newwin(panel_height, panel_width, 1, right_panel_x)
        
        # 绘制面板样式
        left_panel.box()  # 画边框
        left_panel.addstr(0, 2, "Left Panel", curses.A_BOLD | curses.color_pair(1))
        left_panel.addstr(2, 2, f"Current Size: {panel_height}x{panel_width}")
        left_panel.refresh()  # 刷新显示
        
        right_panel.box()
        right_panel.addstr(0, 2, "Right Panel", curses.A_BOLD | curses.color_pair(2))
        right_panel.addstr(2, 2, f"Current Size: {panel_height}x{panel_width}")
        right_panel.refresh()
        
        # 处理用户输入和窗口resize
        key = stdscr.getch()
        if key == ord('q'):  # 按q退出
            break
        elif key == curses.KEY_RESIZE:  # 捕获窗口resize事件
            stdscr.clear()  # 清空屏幕,准备重绘

if __name__ == "__main__":
    # 用curses.wrapper自动处理初始化和终端恢复,避免崩溃后终端乱码
    curses.wrapper(main)

关键逻辑说明:

  • 自动终端管理:用curses.wrapper包裹主函数,它会帮你自动完成curses初始化、异常处理和退出时的终端状态恢复,再也不用担心终端崩溃后乱码的问题。
  • 动态布局计算:每次循环都重新获取终端尺寸,确保resize后立即更新面板大小。边距预留通过计算实现:上下各1字符,左右+中间分隔各1字符,保证两个面板各占屏幕一半且有足够空隙。
  • resize事件处理:通过捕获curses.KEY_RESIZE信号,触发屏幕清空和重绘,实现窗口大小变化时的自适应调整。
  • 可扩展性:这两个面板是独立的curses.window对象,你可以在上面添加任何交互元素——比如滚动文本、输入框、按钮等,直接调用面板的addstr()getch()等方法即可。

小提示:

如果终端尺寸太小(比如宽度小于5),计算出来的面板宽度会变成负数,你可以在代码里加个判断:

if total_cols < 5 or total_lines < 3:
    stdscr.clear()
    stdscr.addstr(0,0, "Please resize your terminal to a larger size!")
    stdscr.refresh()
    stdscr.getch()
    continue

内容的提问来源于stack exchange,提问作者IdecEddy

火山引擎 最新活动