在ruby ncurses中创建窗口菜单

abithluo  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(111)

我试图通过在ncurses中创建一个小菜单来学习ruby和ncurses,该菜单列出了不同的接口和所选接口的接口配置。
由于我想学习的ncurses library没有文档,也没有菜单示例,所以我尝试从NCurses Programming HowTo学习。
我的代码atm在启动时产生以下屏幕(foo被选中但丢失),光标在子窗口中的2/2(x/y)处:

┌────────────────────────────────────────┐
 │                                        │
 │ >                                      │
 │                                        │
 │   bar                                  │
 │                                        │
 └────────────────────────────────────────┘

当选择另一个时(选择了条,但替换为标记),光标在子窗口中的2/2(x/y)处:

┌────────────────────────────────────────┐
 │                                        │
 │   foo                                  │
 │                                        │
 │ >   >                                  │
 │                                        │
 └────────────────────────────────────────┘

现在的问题是:错误在哪里?还是库有问题?
先谢谢你了。

代码

#!/usr/bin/ruby

require 'ncurses'

$number_of_mgmt_devices = 2

# start ncurses
stdscr = Ncurses.initscr
Ncurses.cbreak
Ncurses.noecho
stdscr.keypad(true)

$foobar = Hash(:foo => "AAAAA", :bar => "BBBBB")

# create window and grab keyboard control
length = $number_of_mgmt_devices * 2 + 1
width = 40
devicesMenuWin = Ncurses.newwin(length+2, width + 2, 6, 1)
devicesMenuWin.keypad(true)

# create choices
choices = []
$foobar.each do |key, info| 
    choices.append(Ncurses::Menu::ITEM.new("#{key}", "#{info}"))
end

# 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, 2, 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
        devicesMenuWin.wrefresh
    end
ensure
    devicesMenu.unpost
    Ncurses.echo
    Ncurses.nocbreak
    Ncurses.nl
    Ncurses.endwin
end
fafcakar

fafcakar1#

为什么要为一个基于文本的菜单经历ncurses的所有麻烦呢?安装很麻烦,无法在Windows上安装以重现您的问题。现在你有一个没有依赖关系的Ruby GUI库。https://rubygems.org/gems/glimmer-dsl-libui/versions/0.7.8这里有一个例子

require 'glimmer-dsl-libui'
include Glimmer

menu('Actions') {
  menu_item('Choice 1') {on_clicked {msg_box "Choice 1"}}
  menu_item('Choice 2') {on_clicked {msg_box "Choice 2"}}
  quit_menu_item
}

window {
  title 'Menu testing'
  content_size 300, 200
  on_closing {puts 'Bye Bye'}
}.show
wgmfuz8q

wgmfuz8q2#

在尝试了一些不同的东西之后,问题是用于此的底层库或更好的链接。
我测试了两个不同的系统:

  • debian with ruby-ncurses 1.4.9-1+b6(includes wide char support)-> problematic behavior
  • Fedora(38)与rubygem-ncursesw 1.4.10-10这只是工作

虽然有些库如fedora one可以正确地链接到menuw库(支持menuw的库),但debian one只链接到支持menuw的库panelw,formw和ncursesw,而不是menuw,这是错误的。
不管怎样,谢谢大家。我会添加更多的信息,当我发现更多。

相关问题