2017-08-06 55 views
-1

我目前在Ruby Curses中打印0-3行。我还创建了一个包含动物名称的数组。 我的计划目前输出如何逐行打印数组元素,并用Ruby Curses选择每一行?

dog + 0cat + 0bird + 0rat + 0 
dog + 1cat + 1bird + 1rat + 1 
dog + 2cat + 2bird + 2rat + 2 
dog + 3cat + 3bird + 3rat + 3 

我希望它输出类似

dog + 0 
cat + 1 
bird + 2 
rat + 3 

有没有办法列出在另一条线路的阵列中的每个元素并能够选中各个行?

这里是我的

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) 

    arr = [] 
    arr << "dog" 
    arr << "cat" 
    arr << "bird" 
    arr << "rat" 

    arr.each do |item| 

     menu.addstr "#{item} + #{i}" 
    end 
    end 
end 

我一直在使用arr.each尝试和arr.each_index工作的功能,但它给了我同样的输出。

这是完整的程序。下面

UPDATE

使得菜单看怎么想,但按“W”或“S”通过在菜单中滚动时,它选择在同一时间所有的4个元素。有没有办法让它一次只能选择一个元素?

require "curses" 
include Curses 

init_screen 
start_color 
noecho 

def draw_menu(menu, active_index=nil) 
    4.times do |i| 
    menu.setpos(1, 1) 
    menu.attrset(i == active_index ? A_STANDOUT : A_NORMAL) 

    arr = [] 
    arr << "dog" 
    arr << "cat" 
    arr << "bird" 
    arr << "rat" 

    arr.each_with_index do |element, index| 
     menu.addstr "#{element} + #{index}\n" 
    end  
    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 

回答

1

不知道是什么4.times试图做的,但我认为这是4倍的设置相同的文本到屏幕上的相同位置。对于4个中的每一个,如果当前的4个项目组与active_index相同,则将其全部4个设置为相同样式(A_STANDOUT而不是A_NORMAL)。

什么,似乎是为我工作和我所承担的目的是一样的东西:

def draw_menu(menu, active_index=nil) 
    %w(dog cat bird rat).each_with_index do |element, index| 
    menu.setpos(index + 1, 1) 
    menu.attrset(index == active_index ? A_STANDOUT : A_NORMAL) 

    menu.addstr("%-4s + #{index}" % element) 
    end 

    menu.setpos(5, 1) # set the cursor on the line after the menu items 
end 

,然后在你的draw_info我不能看到那里的案文进行输出,但如果我改变了它到setpos(5, 1)它在菜单后变为可见:

def draw_info(menu, text) 
    menu.setpos(5, 1) 
    menu.attrset(A_NORMAL) 
    menu.addstr text 
end 
+0

这很好用。你在4× – Prox

+0

上是正确的问题:%-4s做什么?我注意到如果我将4改为另一个数字,似乎没有任何区别。 – Prox

+0

哦,这个词左对齐,并确保它们都占用至少4个空格,例如“%-4s”看起来像“老鼠 - + 3”和“%-8s”它变成了“老鼠 - ---- + 3'(用破折号代替空格,因为SO凝聚了空格......那部分是没有必要的,只是在我玩弄一些事情没有排队的例子的时候给我打扰。 。你可以保留该行为'menu.addstr“#{element} +#{index}”'并且没问题 –