使用curses创建菜单

时间:2013-10-15 03:23:22

标签: ruby curses

我正在尝试按照本教程: http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/keys.html

但我担心我一点也不好。

这不是世界上最好的代码,但它说明了我想要做的事情:

        require "curses"
        include Curses

        init_screen #initialize first screen
        start_color #
        noecho

    close = false


        t1 = Thread.new{
        four = Window.new(5,60,2,2)
        four.box('|', '-')


            t2 = Thread.new{

                menu = Window.new(7,40,7,2)
                menu.box('|', '-')
                menu.setpos 1,1
                menu.addstr "item_one"
                menu.setpos 2,1

                menu.attrset(A_STANDOUT)

                menu.addstr "item_two"
                menu.setpos 3,1

                menu.attrset(A_NORMAL)

                menu.addstr "item_three"
                menu.setpos 4,1
                menu.addstr "item_four"

                menu.getch
            }
            t2.join

        while close == false
            ch = four.getch
            case ch
                when 'w'
                    four.setpos 2,1
                    four.addstr 'move up'
                    four.refresh
                when 's'
                    four.setpos 2,1
                    four.addstr 'move down'
                    four.refresh
                when 'x'
                    close = true
            end
        end


        }
        t1.join

按W和D键,我想在菜单窗口中向上和向下移动菜单项。字面上不知道我怎么能移动那个亮点。这意味着在代码中移动属性设置器。我真的不知道。诅咒的资源并不多。

1 个答案:

答案 0 :(得分:5)

您的示例中不需要线程。

你可以在这里看到如何做到这一点:https://gist.github.com/phoet/6988038

require "curses"
include Curses

init_screen
start_color
noecho

def draw_menu(menu, active_index=nil)
  4.times do |i|
    menu.setpos(i + 1, 1)
    menu.attrset(i == active_index ? A_STANDOUT : A_NORMAL)
    menu.addstr "item_#{i}"
  end
end

def draw_info(menu, text)
  menu.setpos(1, 10)
  menu.attrset(A_NORMAL)
  menu.addstr text
end

position = 0

menu = Window.new(7,40,7,2)
menu.box('|', '-')
draw_menu(menu, position)
while ch = menu.getch
  case ch
  when 'w'
    draw_info menu, 'move up'
    position -= 1
  when 's'
    draw_info menu, 'move down'
    position += 1
  when 'x'
    exit
  end
  position = 3 if position < 0
  position = 0 if position > 3
  draw_menu(menu, position)
end