基于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




