在 Ruby GTK 编程教程的这一部分中,我们将使用菜单和工具栏。
GUI 应用中的常见部分是菜单栏。 菜单栏由称为菜单的对象组成。 顶层菜单在菜单栏上带有其标签。 菜单具有菜单项-在应用内部执行特定操作的命令。 菜单也可以具有子菜单,这些子菜单具有自己的菜单项。
简单的菜单栏
在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。
#!/usr/bin/ruby'''ZetCode Ruby GTK tutorialThis example creates a simple menubar.Author: Jan BodnarWebsite: www.zetcode.comLast modified: May 2014'''require 'gtk3'class RubyApp < Gtk::Windowdef initializesuperinit_uienddef init_uioverride_background_color :normal,Gdk::RGBA.new(0.2, 0.2, 0.2, 1)mb = Gtk::MenuBar.newfilemenu = Gtk::Menu.newfilem = Gtk::MenuItem.new "File"filem.set_submenu filemenuexit = Gtk::MenuItem.new "Exit"exit.signal_connect "activate" doGtk.main_quitendfilemenu.append exitmb.append filemvbox = Gtk::Box.new :vertical, 2vbox.pack_start mb, :expand => false,:fill => false, :padding => 0add vboxset_title "Simple menubar"signal_connect "destroy" doGtk.main_quitendset_default_size 300, 200set_window_position :centershow_allendendGtk.initwindow = RubyApp.newGtk.main
这是一个最小的菜单栏功能示例。
mb = Gtk::MenuBar.new
Gtk::MenuBar小部件已创建。 这是菜单的容器。
filemenu = Gtk::Menu.newfilem = Gtk::MenuItem.new "File"filem.set_submenu filemenu
创建包含一个Gtk::Menu的顶层Gtk::MenuItem。
exit = Gtk::MenuItem.new "Exit"exit.signal_connect "activate" doGtk.main_quitendfilemenu.append exit
创建出口Gtk::MenuItem并将其附加到文件Gtk::MenuItem中。
mb.append filem
顶级Gtk::MenuItem被附加到Gtk::MenuBar小部件。
vbox = Gtk::VBox.new false, 2vbox.pack_start mb, false, false, 0
我们将菜单栏放入垂直框中。

图:简单菜单
子菜单
下面的示例演示如何创建子菜单。
#!/usr/bin/ruby'''ZetCode Ruby GTK tutorialThis example shows a submenu.Author: Jan BodnarWebsite: www.zetcode.comLast modified: May 2014'''require 'gtk3'class RubyApp < Gtk::Windowdef initializesuperinit_uienddef init_uioverride_background_color :normal,Gdk::RGBA.new(0.2, 0.2, 0.2, 1)mb = Gtk::MenuBar.newfilemenu = Gtk::Menu.newfilem = Gtk::MenuItem.new "File"filem.set_submenu filemenumb.append filemimenu = Gtk::Menu.newimportm = Gtk::MenuItem.new "Import"importm.set_submenu imenuinews = Gtk::MenuItem.new "Import news feed..."ibookmarks = Gtk::MenuItem.new "Import bookmarks..."imail = Gtk::MenuItem.new "Import mail..."imenu.append inewsimenu.append ibookmarksimenu.append imailfilemenu.append importmexit = Gtk::MenuItem.new "Exit"exit.signal_connect "activate" doGtk.main_quitendfilemenu.append exitvbox = Gtk::Box.new :vertical, 2vbox.pack_start mb, :expand => false,:fill => false, :padding => 0add vboxset_title "Submenu"signal_connect "destroy" doGtk.main_quitendset_default_size 350, 250set_window_position :centershow_allendendGtk.initwindow = RubyApp.newGtk.main
子菜单是另一个菜单中的菜单。
imenu = Gtk::Menu.new
子菜单是Gtk::Menu。
importm = Gtk::MenuItem.new "Import"importm.set_submenu imenu...filemenu.append importm
它是菜单项的子菜单,该菜单项会登录到顶级文件菜单。
inews = Gtk::MenuItem.new "Import news feed..."ibookmarks = Gtk::MenuItem.new "Import bookmarks..."imail = Gtk::MenuItem.new "Import mail..."imenu.append inewsimenu.append ibookmarksimenu.append imail
子菜单有其自己的菜单项。

图:子菜单
图像菜单
在下一个示例中,我们将进一步探索菜单。 我们将图像和加速器添加到我们的菜单项中。 加速器是用于激活菜单项的键盘快捷键。
#!/usr/bin/ruby'''ZetCode Ruby GTK tutorialThis example shows a menu withimages, accelerators and a separator.Author: Jan BodnarWebsite: www.zetcode.comLast modified: May 2014'''require 'gtk3'class RubyApp < Gtk::Windowdef initializesuperinit_uienddef init_uioverride_background_color :normal,Gdk::RGBA.new(0.2, 0.2, 0.2, 1)mb = Gtk::MenuBar.newfilemenu = Gtk::Menu.newfilem = Gtk::MenuItem.new "File"filem.set_submenu filemenuagr = Gtk::AccelGroup.newadd_accel_group agrnewi = Gtk::ImageMenuItem.new :stock_id => Gtk::Stock::NEW,:accel_group => agrkey, mod = Gtk::Accelerator.parse "N"newi.add_accelerator "activate", agr, key,mod, Gtk::AccelFlags::VISIBLEfilemenu.append newiopenm = Gtk::ImageMenuItem.new :stock_id => Gtk::Stock::OPEN,:accel_group => agrkey, mod = Gtk::Accelerator.parse "O"openm.add_accelerator "activate", agr, key,mod, Gtk::AccelFlags::VISIBLEfilemenu.append openmsep = Gtk::SeparatorMenuItem.newfilemenu.append sepexit = Gtk::ImageMenuItem.new :stock_id => Gtk::Stock::QUIT,:accel_group => agrkey, mod = Gtk::Accelerator.parse "Q"exit.add_accelerator "activate", agr, key,mod, :visibleexit.signal_connect "activate" doGtk.main_quitendfilemenu.append exitmb.append filemvbox = Gtk::Box.new :vertical, 2vbox.pack_start mb, :expand => false, :fill => false,:padding => 0add vboxset_title "Image menu"signal_connect "destroy" doGtk.main_quitendset_default_size 300, 200set_window_position :centershow_allendendGtk.initwindow = RubyApp.newGtk.main
我们的示例显示了具有三个菜单项的顶级菜单项。 每个菜单项都有一个图像和一个加速器。 退出菜单项的加速器处于活动状态。
agr = Gtk::AccelGroup.newadd_accel_group agr
要使用加速器,我们创建一个全局Gtk::AccelGroup对象。 稍后将使用。
newi = Gtk::ImageMenuItem.new :stock_id => Gtk::Stock::NEW,:accel_group => agrkey, mod = Gtk::Accelerator.parse "N"newi.add_accelerator "activate", agr, key,mod, Gtk::AccelFlags::VISIBLEfilemenu.append newi
创建了Gtk::ImageMenuItem。 图片来自图片库。 我们还创建了 Ctrl + N 加速器。
sep = Gtk::SeparatorMenuItem.newfilemenu.append sep
这些行创建一个分隔符,该分隔符用于将菜单项放入逻辑组中。

图:图像 menu
简单的工具栏
菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。 接下来,我们创建一个简单的工具栏。
#!/usr/bin/ruby'''ZetCode Ruby GTK tutorialThis example creates a simple toolbar.Author: Jan BodnarWebsite: www.zetcode.comLast modified: May 2014'''require 'gtk3'class RubyApp < Gtk::Windowdef initializesuperinit_uienddef init_uitoolbar = Gtk::Toolbar.newtoolbar.set_toolbar_style Gtk::Toolbar::Style::ICONSnewtb = Gtk::ToolButton.new :stock_id => Gtk::Stock::NEWopentb = Gtk::ToolButton.new :stock_id => Gtk::Stock::OPENsavetb = Gtk::ToolButton.new :stock_id => Gtk::Stock::SAVEsep = Gtk::SeparatorToolItem.newquittb = Gtk::ToolButton.new :stock_id => Gtk::Stock::QUITtoolbar.insert newtb, 0toolbar.insert opentb, 1toolbar.insert savetb, 2toolbar.insert sep, 3toolbar.insert quittb, 4quittb.signal_connect "clicked" doGtk.main_quitendvbox = Gtk::Box.new :vertical, 2vbox.pack_start toolbar, :expand => false,:fill => false, :padding => 0add vboxset_title "Toolbar"signal_connect "destroy" doGtk.main_quitendset_default_size 300, 200set_window_position :centershow_allendendGtk.initwindow = RubyApp.newGtk.main
该示例显示了一个工具栏和四个工具按钮。
toolbar = Gtk::Toolbar.new
Gtk::Toolbar小部件已创建。
toolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS
在工具栏上,我们仅显示图标。
newtb = Gtk::ToolButton.new :stock_id => Gtk::Stock::NEW
创建带有库存图像的Gtk::ToolButton。 该图像来自图像的内置库存。
sep = Gtk::SeparatorToolItem.new
这是一个分隔符。 它可用于将工具栏按钮放入逻辑组。
toolbar.insert newtb, 0toolbar.insert opentb, 1...
工具栏按钮插入到工具栏小部件中。

图:工具栏
撤销重做
以下示例演示了如何停用工具栏上的工具栏按钮。 这是 GUI 编程中的常见做法,例如保存按钮。 如果我们将文档的所有更改都保存到磁盘上,则在大多数文本编辑器中,“保存”按钮将被停用。 这样,应用会向用户指示所有更改都已保存。
#!/usr/bin/ruby'''ZetCode Ruby GTK tutorialThis example shows how toactivate/deactivate a Gtk::ToolButton.Author: Jan BodnarWebsite: www.zetcode.comLast modified: May 2014'''require 'gtk3'class RubyApp < Gtk::Windowdef initializesuper@count = 2init_uienddef init_uitoolbar = Gtk::Toolbar.newtoolbar.set_toolbar_style Gtk::Toolbar::Style::ICONS@undo = Gtk::ToolButton.new :stock_id => Gtk::Stock::UNDO@redo = Gtk::ToolButton.new :stock_id => Gtk::Stock::REDOsep = Gtk::SeparatorToolItem.newquit = Gtk::ToolButton.new :stock_id => Gtk::Stock::QUITtoolbar.insert @undo, 0toolbar.insert @redo, 1toolbar.insert sep, 2toolbar.insert quit, 3@undo.signal_connect "clicked" doon_undoend@redo.signal_connect "clicked" doon_redoendquit.signal_connect "clicked" doGtk.main_quitendvbox = Gtk::Box.new :vertical, 2vbox.pack_start toolbar, :expand => false,:fill => false, :padding => 0self.add vboxset_default_size 300, 200set_window_position :centershow_allset_title "Undo redo"signal_connect "destroy" doGtk.main_quitendenddef on_undo@count = @count - 1if @count <= 0@undo.set_sensitive false@redo.set_sensitive trueendenddef on_redo@count = @count + 1if @count >= 5@redo.set_sensitive false@undo.set_sensitive trueendendendGtk.initwindow = RubyApp.newGtk.main
我们的示例从 GTK 库存资源创建撤消和重做按钮。 单击几下后,每个按钮均被停用。 按钮显示为灰色。
@count = 2
@count变量决定激活或停用哪个按钮。
@undo = Gtk::ToolButton.new :stock_id => Gtk::Stock::UNDO@redo = Gtk::ToolButton.new :stock_id => Gtk::Stock::REDO
我们有两个工具按钮:撤消和重做工具按钮。 图像来自库存资源。
@undo.signal_connect "clicked" doon_undoend
单击撤消按钮,我们触发on_undo方法。
if @count <= 0@undo.set_sensitive false@redo.set_sensitive trueend
要激活或停用小部件,我们使用set_sensitive方法

图:撤销和重做
在 Ruby GTK 教程的这一章中,我们展示了如何使用菜单和工具栏。
