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

Ruby ncurses窗口菜单选中项显示异常问题排查求助

Ruby ncursesw-ruby菜单选中项缺失、标记覆盖问题排查

问题现象

启动菜单时选中的foo项消失,切换选中bar时标记会覆盖内容——并非库本身问题,而是代码配置存在错误。

错误点及修正方案

  1. 窗口高度计算错误
    原代码中length = $number_of_mgmt_devices * 2 + 1,但ncurses菜单每个选项默认占1行,2个选项仅需2行高度,多余的高度会导致菜单绘制偏移,选中项被遮挡。
    修正:直接使用选项数量作为窗口高度,更灵活准确:
length = choices.size
  1. 子窗口创建位置错误
    原derwin(length, width, 2, 2)的y轴偏移设为2,导致菜单内容从窗口第3行开始,标记会覆盖上方区域。应将y轴偏移改为1,让菜单内容与窗口边框对齐:
devicesMenu.sub = devicesMenuWin.derwin(length, width, 1, 2)
  1. 菜单刷新逻辑错误
    仅刷新父窗口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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:21:04