Ruby ncurses窗口菜单选中项显示异常问题排查求助
Ruby ncursesw-ruby菜单选中项缺失、标记覆盖问题排查
问题现象
启动菜单时选中的foo项消失,切换选中bar时标记会覆盖内容——并非库本身问题,而是代码配置存在错误。
错误点及修正方案
- 窗口高度计算错误
原代码中length = $number_of_mgmt_devices * 2 + 1,但ncurses菜单每个选项默认占1行,2个选项仅需2行高度,多余的高度会导致菜单绘制偏移,选中项被遮挡。
修正:直接使用选项数量作为窗口高度,更灵活准确:
length = choices.size
- 子窗口创建位置错误
原derwin(length, width, 2, 2)的y轴偏移设为2,导致菜单内容从窗口第3行开始,标记会覆盖上方区域。应将y轴偏移改为1,让菜单内容与窗口边框对齐:
devicesMenu.sub = devicesMenuWin.derwin(length, width, 1, 2)
- 菜单刷新逻辑错误
仅刷新父窗口devicesMenuWin.wrefresh无法触发菜单选中状态的重新绘制,需调用菜单自身的refresh方法:
devicesMenu.refresh devicesMenuWin.wrefresh
修正后的完整代码
#!/usr/bin/ruby require 'ncurses' # start ncurses stdscr = Ncurses.initscr Ncurses.cbreak Ncurses.noecho stdscr.keypad(true) $foobar = Hash(:foo => "AAAAA", :bar => "BBBBB") # create choices choices = [] $foobar.each do |key, info| choices.append(Ncurses::Menu::ITEM.new("#{key}", "#{info}")) end # create window and grab keyboard control length = choices.size width = 40 devicesMenuWin = Ncurses.newwin(length + 2, width + 2, 6, 1) devicesMenuWin.keypad(true) # create and configure menu devicesMenu = Ncurses::Menu::MENU.new(choices) devicesMenu.opts_off(Ncurses::Menu::O_SHOWDESC) devicesMenu.opts_off(Ncurses::Menu::O_NONCYCLIC) # associate windows with menu devicesMenu.win = devicesMenuWin devicesMenu.sub = devicesMenuWin.derwin(length, width, 1, 2) devicesMenu.set_spacing(0, 2, 0) devicesMenu.mark = " > " Ncurses.box(devicesMenuWin, 0, 0) devicesMenu.post devicesMenuWin.refresh begin while c = devicesMenuWin.wgetch; c != "o" case c when Ncurses::KEY_UP devicesMenu.driver(Ncurses::Menu::REQ_PREV_ITEM) when Ncurses::KEY_DOWN devicesMenu.driver(Ncurses::Menu::REQ_NEXT_ITEM) end devicesMenu.refresh devicesMenuWin.wrefresh end ensure devicesMenu.unpost Ncurses.echo Ncurses.nocbreak Ncurses.nl Ncurses.endwin end
结论
问题源于代码中窗口尺寸、子窗口位置及刷新逻辑的配置错误,修正后菜单可正常显示选中标记,不会出现内容覆盖或选中项消失的情况。
内容的提问来源于stack exchange,提问作者Luca R
相关产品推荐
相关产品推荐

