我正在尝试通过在 ncurses 中创建一个小菜单来更多地学习 ruby 和 ncurses,其中列出了不同的接口以及所选接口的接口配置。
由于我想学习的 ncurses 库并没有真正的文档,也没有菜单示例,所以我尝试从 NCurses 编程指南中学习。
我的 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
为什么要为基于文本的菜单经历 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
尝试了几种不同的方法后,问题出在用于该操作的底层库上。
我测试了两种不同的系统:
无论如何,谢谢大家。当我找到更多信息时,我会添加更多信息。